2015-10-09 85 views
0

我有一个搜索文本字段,当他开始输入时向用户提供一个自动补全建议列表。 用户也可以点击一个建议或按下键盘的搜索按钮以使用输入文本执行搜索。ReactiveCocoa - 停止命令

如果用户在等待出现建议之前开始键入并按下搜索,则可能会出现建议表,并在搜索完成后打开建议表。由于建议结果是由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

+0

的可能的复制[取消RACCommand执行(http://stackoverflow.com/questions/23784097/cancel-raccommand-execution) –

+0

我忘了补充,我使用takeUntil操作的一部分,看我上面的编辑。谢谢! – DAN

回答

1

我认为这个问题是由throttle造成的。它将nextsearchTextField推迟。

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

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

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

它的作品,你摇滚! – DAN