我有一个带有搜索栏的表格视图。该表加载了 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;
};