0

我對任何類型的多線程都很陌生,而且根本看不到一個簡單的搜索方法正確地處理後臺線程。一切似乎都是按照NSAutoreleasePool的順序進行的,UI在主線程上進行更新。該應用程序不會崩潰,並在後臺執行搜索,但搜索結果會多次生成幾個相同的項目,具體取決於我輸入的速度。搜索正常工作時沒有多線程(已被註釋掉),但由於我正在處理大量的數據,所以速度很慢。下面的代碼:iPhone多線程搜索

- (void)filterContentForSearchText:(NSString*)searchText { 
isSearching = YES; 
NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init]; 

/* 
    Update the filtered array based on the search text and scope. 
    */ 

//[self.filteredListContent removeAllObjects]; // First clear the filtered array. 


for (Entry *entry in appDelegate.entries) 
{ 
    NSComparisonResult result = [entry.gurmukhiEntry compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])]; 
    if (result == NSOrderedSame) 
    { 
    [self.filteredListContent addObject:entry]; 
    } 
} 

[self.searchDisplayController.searchResultsTableView performSelectorOnMainThread:(@selector(reloadData)) withObject:nil waitUntilDone:NO]; 
//[self.searchDisplayController.searchResultsTableView reloadData]; 

[apool drain]; 
isSearching = NO; } 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    if (!isSearching) { 
     [self.filteredListContent removeAllObjects]; // First clear the filtered array. 
     [self performSelectorInBackground:(@selector(filterContentForSearchText:)) withObject:searchString]; 
    } 
    //[self filterContentForSearchText:searchString]; 

     return NO;  // Return YES to cause the search result table view to be reloaded. } 

回答

0

幾件事情:

  • 多線程不應該帶來一個單核CPU的任何性能提升。如果你認爲你看到很好的加速,可能你的算法很腥。
  • 如果您訪問共享變量,請確保它是線程安全的。您似乎將您的搜索結果寫入一個共享對象。沒有同步就會失敗。
  • 該代碼看起來好像所有線程都在完全相同的數據集上工作,所以如果一個線程發現匹配,其他線程將找到相同的並將其放在那裏。
  • 不要忘記同步訪問「結果對象」以及從主線程訪問它時。
0

你可能想看看NSOperation。考慮製作一個NSOperation的子類並添加一個作爲您發佈的文件中實現的類的屬性。

然後在 - (BOOL)searchDisplayController:(UISearchDisplayController *)控制器shouldReloadTableForSearchString:(的NSString *)searchString的{

可以用一個指針到搜索數據和文本設置對象。然後,您可以檢查對象是否正在運行(我認爲),如果是,請調用「取消」並使用新的搜索字符串重新啓動它。可能有一個更聰明的方法,但我會懷疑NSOperation是一個開始尋找的好地方。