我有一个搜索文本字段,当用户开始输入时,它会向用户提供自动完成建议的列表。 用户也可以点击建议或按键盘的搜索按钮以使用输入文本执行搜索。
如果用户开始输入内容,然后在等待建议出现之前按下搜索,则可能会出现以下情况:建议表将在搜索完成后打开。由于建议结果是通过 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 运算符没有效果。
非常感谢, 丹
最佳答案
我认为问题是由throttle
引起的。它延迟了 searchTextField
的 next
。
- 如果在您点击搜索按钮之前下一个到达,则一切正常。
- 如果它晚于到达,
rac_getProductsSuggestionsWithParameters
无论如何都会执行。
所以需要检查后一种情况。例如:
if (self.searchTextField.isFirstResponder) {
[self.suggestionsViewModel.rac_searchSuggestions execute:self.searchTextField.text];
}
关于ios - ReactiveCocoa - 停止命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33033100/