我嘗試使用油門來訂閱信號,但它從不執行。ReactiveCocoa:油門從不執行/不工作
我有一個UISearchController (注意:UISearchController從iOS8上,而不是舊的UISearchDisplayController,其工作安靜的更好,擁有數以千計的網絡工作教程和實例),並希望使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
}];
現在我想扼殺這個信號。但是當我實施調節油門時,沒有任何反應。訂閱下一個永遠不會被稱爲:
[[RACObserve(self, currentFilter) throttle:500] subscribeNext:^(NSString* x) {
NSLog(@"%@", x); // will never be called
}];
如何實現油門輸入在搜索欄?這裏有什麼問題?
UPDATE
我發現了一個workaround besides ReactiveCocoa感謝@malcomhall。我將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「節流」是工作,爲什麼不能在這種情況下:)
哦親愛的.....非常感謝 – itinance