1

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

1 回答 1

3

我看到的最重要的事情:您在排序函数中分配了 4 个对象。对象分配不是很快!相反,尝试使用 -rangeOfString:options: 并传递 NSCaseInsensitiveSearch。

于 2012-08-06T17:35:17.887 回答