我有一個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%的速度提升:
這裏是重構的排序塊:
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;
};
只需注意:您可以將比較函數定義爲'^ NSComparisonResult(Tip * tip1,Tip * tip2){...}'。然後Xcode會在塊中自動完成,編譯器可以做更好的錯誤檢查。 – 2012-08-10 13:36:33