iphone - 使用 dispatch_async 加速搜索?

标签 iphone ios objective-c ios6 grand-central-dispatch

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

所以我试图通过使用 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/

相关文章:

ios - NSURLConnection:我正在尝试接收 html 页面,但总是收到错误 403

ios - Objective-C 自定义 UITableView 类不加载

ios - 添加第二个 .plist 作为子 Pane

objective-c - FetchResult Controller 委托(delegate) - 不兼容类型警告

php - 使用 PHP 从 Apple 增强推送通知中读取错误

iphone - Mac OS X 如何知道将 .app 文件夹显示为文件?

ios - iOS 中的水平日历

ios - 为什么在尝试垂直对齐我的 UILabel 时 sizeToFit 不起作用?它只是停留在中心

objective-c - Cocoa窗口位置异常

iphone - iOS下渲染为浮点纹理