ReactiveCocoa:节流永远不会执行/不工作

时间:2015-05-24 17:00:20

标签: objective-c reactive-cocoa

我尝试订阅带油门的信号,但它永远不会执行。

我有一个UISearchController (注意:来自iOS8的UISearchController,而不是更老的UISearchDisplayController,它更安静地运行,并且在网络上有成千上万的工作教程和示例)并且希望在生成API请求时用户正在打字。 为了让流量低,我不想用用户按下的每个键启动API请求,但是当用户停止一段时间时,比如说最后一次按键后500毫秒。

由于我们无法在UISearchController的SearchBar中引用TextField,因此我们使用来自UISearchController的委托:

要在搜索栏中获取Textfield的最新类型文本,我使用:

token

属性 currentFilter 保留当前搜索字符串。

此外,我在 currentFilter -Property上有一个RACObserve,可以对每个对此属性所做的更改做出反应:

#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;
}

现在我想限制这个信号。但是当我实现对油门的调用时,没有任何反应。 SubscribeNext永远不会被调用:

[RACObserve(self, currentFilter) subscribeNext:^(NSString* x) {
    NSLog(@"Current Filter: %@", x);
    // do api calls and everything else
}];

如何在搜索栏中实现节流输入?那里有什么问题?

更新

我感谢@malcomhall找到了workaround besides ReactiveCocoa。我将updateSearchResultsForSearchController-delegate方法中的代码移动到一个单独的方法中,并使用performSelector进行调度,并使用cancelPreviousPerformRequestsWithTarget取消此调度程序。

[[RACObserve(self, currentFilter) throttle:500] subscribeNext:^(NSString* x) {
    NSLog(@"%@", x); // will never be called
}];

无论如何,我还是想了解"油门"从ReactiveCocoa开始工作,为什么不在这种情况下:)

1 个答案:

答案 0 :(得分:4)

-throttle:接受NSTimeInterval,这是的浮点规范,而不是毫秒。

考虑到问题中的代码,我希望你会在500秒后看到结果。