ReactiveCocoa - 停止命令

时间:2015-10-09 08:07:39

标签: ios objective-c reactive-programming reactive-cocoa

我有一个搜索文本字段,在用户开始输入时为其提供自动填充建议列表。 用户可以选择点击建议或按键盘的搜索按钮以使用输入文本执行搜索。

如果用户开始输入然后在等待建议出现之前按下搜索,可能会发生搜索完成后打开建议表。由于使用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;
}

你如何阻止建议查找并禁止重新加载表?

基于Cancel RACCommand execution,似乎解决方案是使用 takeUntil 运算符。 这是rac_searchSuggestions,它应该是“搜索建议直到产品搜索开始”的翻译:

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

不幸的是,takeUntil运算符没有效果。

非常感谢, DAN

1 个答案:

答案 0 :(得分:1)

我认为问题是由throttle引起的。它将next推迟到searchTextField

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

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

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