ios - 在主线程上重新加载 TableView 导致崩溃 - iOS

标签 ios multithreading uitableview grand-central-dispatch

在重新加载 tableView 之前,我有一些繁重的处理(将数千个本地 JSON 对象解析为 dataSource 用于 UITableView 的数组) 。现在,当我只是一个接一个地做,没有任何线程或其他东西时,UI 在加载数据时会卡住。

所以我尝试在 background thread 上进行处理并在 main thread 上重新加载 tableView,但这导致了 tableView 在处理完成之前重新加载,导致崩溃。

如何解决?

这是我的代码:

// Heavy work dispatched to a separate thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        temp = [ayatArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(self.SratNo == %@)",mood]];

        NSSet *uniqueSet = [NSSet setWithArray:[temp valueForKey:@"Para"]];
        NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
        uniqueParasArray = [uniqueSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];

        currentParaNum = [uniqueParasArray[i] integerValue];
        NSNumber *mood = @(currentParaNum);

        NSArray *paraWiseAyats = [[NSArray alloc] init];
        paraWiseAyats = [temp filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(self.Para == %@)",mood]];



        ayatArrayForTableView = [paraWiseAyats mutableCopy];
        [self.translationTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];

});

最佳答案

尝试使用下面的代码。在您的 global_queue block 内使用 main_queue

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        temp = [ayatArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(self.SratNo == %@)",mood]];

        NSSet *uniqueSet = [NSSet setWithArray:[temp valueForKey:@"Para"]];
        NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
        uniqueParasArray = [uniqueSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];

        currentParaNum = [uniqueParasArray[i] integerValue];
        NSNumber *mood = @(currentParaNum);

        NSArray *paraWiseAyats = [[NSArray alloc] init];
        paraWiseAyats = [temp filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(self.Para == %@)",mood]];



        ayatArrayForTableView = [paraWiseAyats mutableCopy];

       // Use block here
       dispatch_async(dispatch_get_main_queue(), ^{
                // Update UI
               [self.translationTableView reloadData];
            });

});

关于ios - 在主线程上重新加载 TableView 导致崩溃 - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51809907/

相关文章:

ios - 图层 slider - 框阴影窗口在 iPhone/iPad 上不起作用

c++ - 如何处理多个源队列消息类型

ios - 如何实现数据表

iphone - 获取 UITableViewCell 子类中单元格的高度

iphone - 崩溃日志分析

ios - 向协议(protocol)添加参数(委托(delegate))

ios - 如何在特定线程完成工作后执行一些代码?

java - 停止无限循环 Runnable 从 ThreadPool 运行

swift - Swift 中的 UILabel 根据行数而变化

ios - 在 Xcode Interface Builder 中隐藏 Storyboard 上的 iOS Home Indicator?