gpt4 book ai didi

iphone - 使用 dispatch_async 加速搜索?

转载 作者:技术小花猫 更新时间:2023-10-29 10:59:29 25 4
gpt4 key购买 nike

我正在尝试加快我的应用搜索速度,但当有大量数据时它会出现滞后。

所以我试图通过使用 dispatch_async 而不是 dispatch_syncUI 上拆分搜索 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com