2012-08-06 50 views
1

我有一個tableview,帶有一個搜索欄。該表加載了3700個文本對象。搜索發生在「標題」文本上,平均長度爲35個字符。我正在尋找可加快搜索排序過程的任何優化建議。目前,搜索排序平均爲0.733秒,約爲整個搜索執行時間的95%。我正在使用一個使用CONTAINS的謂詞(不得不),然後使用sortedArrayUsingComparator :,我通過一個塊。Objective-C優化排序filterContentForSearchText:

感謝您的參觀!

下面是我在做什麼:

//My sorting block implementation 
    self.mySortBlock = ^NSComparisonResult(id obj1, id obj2) { 
     Tip *tip1 = obj1; 
     Tip *tip2 = obj2; 

     NSString *string1 = [tip1.subject lowercaseString]; 
     NSString *string2 = [tip2.subject lowercaseString]; 

     NSUInteger searchStringLocation1 = [string1 rangeOfString:[self.userSearchText lowercaseString]].location; 
     NSUInteger searchStringLocation2 = [string2 rangeOfString:[self.userSearchText lowercaseString]].location; 

     if (searchStringLocation1 > searchStringLocation2) return NSOrderedDescending; 
     if (searchStringLocation1 < searchStringLocation2) return NSOrderedAscending; 
     return NSOrderedSame; 
    }; 

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 

    NSPredicate *filter = [NSPredicate predicateWithFormat:@"subject CONTAINS [cd] %@", searchText]; 
    NSArray *filtered = [myArray filteredArrayUsingPredicate: filter]; 
    self.sorted = nil; 
    self.sorted = [filtered sortedArrayUsingComparator:self.mySortBlock]; 

} 

編輯下面 每Catfish_Man的建議下,我重構排序塊不實例塊中的對象,除非絕對必要的。我刪除了4個對象實例。該重構帶來了,一個+ 300%的速度提升:

enter image description here

這裏是重構的排序塊:

self.mySortBlock = ^NSComparisonResult(id obj1, id obj2) { 


    NSUInteger searchStringLocation1 = [[obj1 subject] rangeOfString:self.userSearchText options:NSCaseInsensitiveSearch].location; 

    NSUInteger searchStringLocation2 = [[obj2 subject] rangeOfString:self.userSearchText options:NSCaseInsensitiveSearch].location; 


    if (searchStringLocation1 > searchStringLocation2) return NSOrderedDescending; 
    if (searchStringLocation1 < searchStringLocation2) return NSOrderedAscending; 
    return NSOrderedSame; 
}; 
+0

只需注意:您可以將比較函數定義爲'^ NSComparisonResult(Tip * tip1,Tip * tip2){...}'。然後Xcode會在塊中自動完成,編譯器可以做更好的錯誤檢查。 – 2012-08-10 13:36:33

回答

3

最大的事我看:你在你的排序分配4個對象功能。對象分配不是很快!相反,請嘗試使用-rangeOfString:options:並傳遞NSCaseInsensitiveSearch。

+0

謝謝。好點子。我重構了我的排序塊並將比較和報告結果 – Slinky 2012-08-07 11:33:28

+0

真正令人印象深刻的速度提升。謝謝,鮎魚人。 – Slinky 2012-08-07 14:11:13