検索バー付きのテーブルビューがあります。テーブルには 3700 個のテキスト オブジェクトがロードされます。検索は、平均で 35 文字の長さの「タイトル」テキストに対して行われます。検索の並べ替えプロセスを高速化する最適化の提案を探しています。現在、検索ソートには平均で 0.733 秒かかっており、これは検索実行時間全体の約 95% に相当します。CONTAINS を使用する述語を使用しており (残念ながらそうする必要があります)、次に sortedArrayUsingComparator: を使用して、ブロックを渡します。
ご覧いただきありがとうございます。
これが私がやっていることです:
//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;
};