Uitableview 目标-C优化filterContentForSearchText中的排序:
我有一个带有搜索栏的tableview。该表加载了3700个文本对象。搜索发生在“标题”文本上,平均长度为35个字符。我正在寻找任何优化建议,将加快搜索排序过程。目前,搜索排序平均需要0.733秒,约占整个搜索执行时间的95%。我使用的谓词使用CONTAINS(不幸的是,必须),然后使用sortedArrayUsingComparator:,在这里我传递一个块 谢谢你看 以下是我正在做的:Uitableview 目标-C优化filterContentForSearchText中的排序:,uitableview,ios5,nspredicate,objective-c-blocks,Uitableview,Ios5,Nspredicate,Objective C Blocks,我有一个带有搜索栏的tableview。该表加载了3700个文本对象。搜索发生在“标题”文本上,平均长度为35个字符。我正在寻找任何优化建议,将加快搜索排序过程。目前,搜索排序平均需要0.733秒,约占整个搜索执行时间的95%。我使用的谓词使用CONTAINS(不幸的是,必须),然后使用sortedArrayUsingComparator:,在这里我传递一个块 谢谢你看 以下是我正在做的: //My sorting block implementation self.mySort
//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];
}
//我的排序块实现
self.mySortBlock=^n比较结果(id obj1,id obj2){
尖端*tip1=obj1;
Tip*tip2=obj2;
NSString*string1=[tip1.subject小写字符串];
NSString*string2=[tip2.subject小写字符串];
NSInteger searchStringLocation1=[string1 rangeOfString:[self.userSearchText小写]]位置;
NSUInteger searchStringLocation2=[string2 rangeOfString:[self.userSearchText小写]]位置;
如果(searchStringLocation1>searchStringLocation2)返回取消搜索;
如果(searchStringLocation1
编辑
根据下面Catfish_-Man的建议,我重构了sort块,除非绝对必要,否则不会实例化块内的对象。我删除了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;
};
self.mySortBlock=^n比较结果(id obj1,id obj2){
NSUInteger searchStringLocation1=[[obj1主题]rangeOfString:self.userSearchText选项:NSCaseInsensitiveSearch]。位置;
NSUInteger searchStringLocation2=[[obj2 subject]rangeOfString:self.userSearchText选项:NSCaseInsensitiveSearch]。位置;
如果(searchStringLocation1>searchStringLocation2)返回取消搜索;
如果(searchStringLocation1
我看到的最大的事情是:在排序函数中分配了4个对象。对象分配不是很快!相反,请尝试使用-rangeOfString:options:并通过NSCaseInsensitiveSearch。谢谢。说得好。我重构了我的排序块,并将比较和报告结果。速度的提高真是令人印象深刻。谢谢,鲶鱼先生。请注意:您可以将比较函数定义为^NSComparisonResult(Tip*tip1,Tip*tip2){…}
。然后Xcode将在块中执行自动完成,编译器可以更好地执行错误检查。