ReactiveCocoa - 停止命令

ReactiveCocoa - Stopping a command

我有一个搜索文本字段,当用户开始输入时,它会为用户提供一个自动完成建议列表。 用户也可以点击建议或按键盘的搜索按钮以使用输入的文本执行搜索。

如果用户开始键入然后在等待建议出现之前按搜索,可能会出现这样的情况,建议 table 将在搜索完成后打开。由于建议结果是通过 RACCommand 触发的,因此我需要一种在搜索开始时停止此类命令的方法。

搜索建议的过程如下:

@weakify(self);
[[[self.searchTextField.rac_textSignal.distinctUntilChanged ignore:@""] throttle:0.5] subscribeNext:^(id x) {
    @strongify(self);
    [self.suggestionsViewModel.rac_searchSuggestions execute:self.searchTextField.text];
}];

[self.suggestionsViewModel.rac_searchSuggestions.executionSignals.flatten
    subscribeNext:^(id x) {
        @strongify(self);
        [self.suggestionsTableView reloadData];
        [self viewDidLayoutSubviews]; // Update the suggestions table frame
}];

通过文本字段的搜索被触发:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.productsViewModel.rac_reloadCommand execute:textField.text];
    [textField resignFirstResponder];
    return YES;
}

您如何停止查找建议并禁止其 table 重新加载?

基于 Cancel RACCommand execution 看来解决方案是使用 takeUntil 运算符。 这里的rac_searchSuggestions,应该是"search for suggestions until a products search starts"的翻译:

self.rac_searchSuggestions = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    @strongify(self);
    return [[self rac_getProductsSuggestionsWithParameters:@{@"query":input}] 
            takeUntil:self.productsViewModel.rac_reloadCommand.executionSignal]];
}];

遗憾的是,takeUntil 运算符无效。

非常感谢, 丹

我认为问题是由 throttle 引起的。它延迟了 searchTextField 之后的 next

  • 如果下一个在您点击搜索按钮之前到达,则一切都很好。
  • 如果晚到,rac_getProductsSuggestionsWithParameters无论如何都会被执行。

所以你需要检查后一种情况。例如:

if (self.searchTextField.isFirstResponder) {
    [self.suggestionsViewModel.rac_searchSuggestions execute:self.searchTextField.text]; 
}