"按您键入搜索"结果花了太长时间

时间:2014-04-02 12:04:18

标签: ios multithreading sorting core-data uisearchdisplaycontroller

我在您输入"时执行"搜索使用核心数据DB进行搜索。它与NSFetchedRequestController一起工作得很好。但是现在,我收到了一个功能请求,要求按用户的距离排列结果(它是一个商店列表)。 说用户写" e"在搜索中,大约有7000个结果,iOS设备需要2-3秒才能按距离排序,同时UI被卡住了。 我考虑过将排序请求发送到另一个线程,但是我会向用户显示什么?如果我发送请求然后他输入另一封信,会发生什么?如果他输入和删除了几次,我会在许多线程上有很多请求占用计算能力。

解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:0)

首先 - 通过Instruments分析代码中最有问题的部分 - >时间分析器。也许你在代码中有问题,可以通过重写来解决。 如果没有帮助,我建议你这样的事情: 1)最简单 - 删除功能“打字时搜索”:) 2)在开始搜索和输入之间延迟1秒 - 所以当用户输入你不搜索,然后如果用户停止输入,你就这样做。 3)更改数据库模型 - (例如为商店添加一些区域,如果在该地区的用户,仅搜索该地区的商店。只需看一下您的数据库模型以及如何改进它的事情) 4)搜索背景并在搜索时显示活动指示

答案 1 :(得分:0)

您可以采取一些措施来优化用户体验。

一个选项是向用户显示加载指示符(例如https://github.com/jdg/MBProgressHUD),并为排序创建一个NSOperation,您可以在后台处理。

这里的NSOperationQueue可以取消任务,例如,如果用户继续输入额外的字母。

例如:

// Interface

@property (nonatomic, strong) NSOperationQueue *sortQueue;

// Implementation 

self.sortQueue = [[NSOperationQueue alloc] init];
[self.sortQueue addOperationWithBlock:^{
    //Sort results here

    dispatch_async(dispatch_get_main_queue(), ^{
        //Update UI here
    });
}];

如果用户输入了更多文字,您可以通过执行以下操作取消待处理的排序:

[self.queue cancelAllOperations];

排队等候。