Objective c 反应性:油门从不执行/不工作

Objective c 反应性:油门从不执行/不工作,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我试图用油门订阅信号,但它从未执行 我有一个UISearchController(注意:来自iOS8的UISearchController,而不是旧的UISearchDisplayController,它工作起来更安静,在web上有数千个工作教程和示例),希望在用户键入时发出API请求。 为了降低通信量,我不想用用户按下的每个键启动API请求,但是当用户停止一段时间时,比如说在最后一次按键后500毫秒 由于我们无法引用UISearchController搜索栏中的文本字段,因此我们使用UISea

我试图用油门订阅信号,但它从未执行

我有一个UISearchController(注意:来自iOS8的UISearchController,而不是旧的UISearchDisplayController,它工作起来更安静,在web上有数千个工作教程和示例),希望在用户键入时发出API请求。 为了降低通信量,我不想用用户按下的每个键启动API请求,但是当用户停止一段时间时,比如说在最后一次按键后500毫秒

由于我们无法引用UISearchController搜索栏中的文本字段,因此我们使用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,我找到了一种反应灵敏的可可。我将updateSearchResultsForSearchController委托方法中的代码移动到一个单独的方法中,并使用PerformSelect对其进行调度,使用cancelPreviousPerformRequestsWithTarget取消此调度程序

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {

    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(useTextSearchQuery) object:nil];
    [self performSelector:@selector(useTextSearchQuery) withObject:nil afterDelay:1.0];

}

无论如何,我仍然想了解ReactiveCocoa的“throttle”是如何工作的,为什么不在本例中:)

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


给定问题中的代码,我希望您在500秒后会看到结果。

-throttle:
接受
NSTimeInterval
,它是秒而不是毫秒的浮点规格

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