2015-05-24 65 views
1

我嘗試使用油門來訂閱信號,但它從不執行。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「節流」是工作,爲什麼不能在這種情況下:)

回答

4

-throttle:接受一個NSTimeInterval,這是浮點規範,不是毫秒。

鑑於問題中的代碼,我希望您會在500秒後看到結果。

+0

哦親愛的.....非常感謝 – itinance