【发布时间】:2015-05-24 17:00:19
【问题描述】:
我尝试使用油门订阅信号,但它从未执行。
我有一个 UISearchController (注意:来自 iOS8 的 UISearchController,而不是旧的 UISearchDisplayController,它运行得更好,并且在网络上有数千个工作教程和示例) 并且想要在用户正在打字。 为了让流量较低,我不想在用户按下的每个键时启动 API-Requests,但是当用户停止一段时间时,比如在最后一次按键后 500 毫秒。
由于我们无法在 UISearchController 的 SearchBar 中引用 TextField,我们使用来自 UISearchController 的委托:
要在搜索栏中获取文本字段的最新键入文本,我使用以下方法:
#pragma mark - UISearchResultsUpdating
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
NSString *searchText = searchController.searchBar.text;
// strip out all the leading and trailing spaces
NSString *strippedString = [searchText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if([strippedString isEqualToString:self.currentFilter]) {
return;
}
self.currentFilter = strippedString;
}
currentFilter 属性保存当前搜索字符串。
另外,我在 currentFilter-属性上有一个 RACObserve,可以对对该属性所做的每项更改做出反应:
[RACObserve(self, currentFilter) subscribeNext:^(NSString* x) {
NSLog(@"Current Filter: %@", x);
// do api calls and everything else
}];
现在我想限制这个信号。但是当我执行节流调用时,什么也没有发生。永远不会调用 SubscribeNext:
[[RACObserve(self, currentFilter) throttle:500] subscribeNext:^(NSString* x) {
NSLog(@"%@", x); // will never be called
}];
如何实现在搜索栏中限制输入?这里出了什么问题?
更新
感谢@malcomhall,我找到了workaround besides ReactiveCocoa。我将 updateSearchResultsForSearchController-delegate 方法中的代码移动到一个单独的方法中,并使用 performSelector 对其进行调度,并使用 cancelPreviousPerformRequestsWithTarget 取消此调度程序。
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(useTextSearchQuery) object:nil];
[self performSelector:@selector(useTextSearchQuery) withObject:nil afterDelay:1.0];
}
无论如何,我仍然想了解 ReactiveCocoa 的“节流”是如何工作的,为什么在这种情况下不可以 :)
【问题讨论】:
标签: objective-c reactive-cocoa