【问题标题】:Objective-C Optimizing a Sort in filterContentForSearchText:Objective-C 优化 filterContentForSearchText 中的排序:
【发布时间】:2012-08-06 17:19:11
【问题描述】:

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

【问题讨论】:

  • 请注意:您可以将比较函数定义为^NSComparisonResult(Tip *tip1, Tip *tip2) { ... }。然后 Xcode 会在 block 中做自动补全,编译器可以做更好的错误检查。

标签: uitableview ios5 nspredicate objective-c-blocks


【解决方案1】:

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

【讨论】:

  • 谢谢。好点子。我重构了我的排序块并将比较和报告结果
  • 真正令人印象深刻的速度改进。谢谢,鲶鱼人。
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 2013-03-09
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多