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

时间:2018-08-12 14:48:15

标签: ios multithreading uitableview grand-central-dispatch

我需要进行一些繁重的处理(将成千上万个本地JSON对象解析为dataSource的{​​{1}}到Array中),然后再重新加载UITableView。现在,当我简单地一个接一个地进行操作而没有任何线程或东西时,UI在加载数据时会冻结。

因此,我尝试在tableView上进行处理,并在background thread上重新加载tableView,但这导致main thread重新加载在处理完成之前发生,从而导致崩溃。

如何解决?

这是我的代码:

tableView

2 个答案:

答案 0 :(得分:1)

尝试使用以下代码。在您的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]; }); });

subtract()

答案 1 :(得分:0)

来自performSelectorOnMainThread:withObject:waitUntilDone:的文档

  

此方法向其当前上下文的运行循环进行注册,并依赖于定期运行的运行循环才能正确执行。一个常见的上下文是调用分派队列调用时,可能会调用此方法并最终向不是定期自动运行的runloop注册。如果在调度队列上运行时需要这种功能,则应使用dispatch_after和相关方法来获得所需的行为。