【问题标题】:ReactiveCocoa: throttle never executes / not workingReactiveCocoa:油门从不执行/不工作
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2022-08-11
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多