我需要进行一些繁重的处理(将成千上万个本地JSON对象解析为dataSource
的{{1}}到Array中),然后再重新加载UITableView
。现在,当我简单地一个接一个地进行操作而没有任何线程或东西时,UI在加载数据时会冻结。
因此,我尝试在tableView
上进行处理,并在background thread
上重新加载tableView
,但这导致main thread
重新加载在处理完成之前发生,从而导致崩溃。
如何解决?
这是我的代码:
tableView
答案 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和相关方法来获得所需的行为。