我正在尝试加快我的应用搜索速度,但当有大量数据时它会出现滞后。
所以我试图通过使用 dispatch_async
而不是 dispatch_sync
在 UI 上拆分搜索 Predicate 原因没有什么不同如果我使用它。
问题是当我使用 dispatch_async
时,应用程序有时会崩溃,因为 [__NSArrayI objectAtIndex:]: index "17"beyond bounds
。
我现在发生这种情况是因为可以说第一个仍然有效并重新加载 tableView 并继续搜索将根据结果更改数组大小所以在这种情况下“崩溃”:(
这是我的代码:
dispatch_async(myQueue, ^{
searchArray = [PublicMeathods searchInArray:searchText array:allData];
} );
if(currentViewStyle==listViewStyle){
[mytable reloadData];
}
我已经试过了:
dispatch_async(myQueue, ^{
NSArray *tmpArray = [PublicMeathods searchInArray:searchText array:allData];
dispatch_sync(dispatch_get_main_queue(), ^{
searchArray = tmpArray;
[mytable reloadData];
});
});
但在这种情况下,滞后仍然存在。
更新-1-:
搜索谓词仅需 2 毫秒 :) 经过艰苦的工作 :) 但是当用户搜索时键盘仍然滞后,所以我在得到结果后唯一做的就是重新加载表“用户界面的变化”,我认为这是滞后的,
所以我搜索的是拆分这两个操作“在键盘上键入和刷新 UI”。
更新-2-:
@matehat https://stackoverflow.com/a/16879900/1658442
和
@TomSwift https://stackoverflow.com/a/16866049/1658442
答案就像一个魅力:)
最佳答案
如果 searchArray
是用作 TableView 数据源的数组,那么这个数组必须
只能在主线程访问和修改。
因此,在后台线程上,应该先过滤到一个单独的临时数组中。然后将临时数组分配给主线程上的 searchArray
:
dispatch_async(myQueue, ^{
NSArray *tmpArray = [PublicMeathods searchInArray:searchText array:allData];
dispatch_sync(dispatch_get_main_queue(), ^{
searchArray = tmpArray;
[mytable reloadData];
});
});
更新:使用临时数组应该可以解决崩溃问题,使用后台线程有助于在搜索期间保持 UI 响应。但正如讨论中所证明的那样,搜索缓慢的一个主要原因可能是复杂的搜索逻辑。
它可能有助于存储额外的“规范化”数据(例如,所有转换为小写,电话号码转换为标准格式等......)以便可以完成实际搜索 更快的不区分大小写的比较。
关于iphone - 使用 dispatch_async 加速搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16685922/