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