Uitableview 目标-C优化filterContentForSearchText中的排序:

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

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

}
//我的排序块实现
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将在块中执行自动完成,编译器可以更好地执行错误检查。