【发布时间】:2011-12-16 09:22:13
【问题描述】:
我有一个单独的线程来创建一个 UIView 对象,将它插入 UITableView 的数据源,然后在 UITableView 上调用 reloadData。但是由于是单独的线程,所以不能直接调用reloadData,需要让主线程来做……但是怎么告诉主线程来做呢?
谢谢
【问题讨论】:
标签: ios multithreading uitableview uiview reloaddata
我有一个单独的线程来创建一个 UIView 对象,将它插入 UITableView 的数据源,然后在 UITableView 上调用 reloadData。但是由于是单独的线程,所以不能直接调用reloadData,需要让主线程来做……但是怎么告诉主线程来做呢?
谢谢
【问题讨论】:
标签: ios multithreading uitableview uiview reloaddata
您可以使用异步调度,此方法允许您将工作线程编组为内联代码块,而不是使用 performSelectorOnMainThread 的方法:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableview reloadData];
});'
【讨论】:
这样的事情怎么样? (可能无法编译,我正在打出来)
- (void) callReloadData
{
if ([NSThread isMainThread]) {
@synchronized (self.tableView) {
[self.tableView reloadData];
}
} else {
[self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}
}
【讨论】:
waitUntilDone: 为YES,performSelectorOnMainThread: 将立即调用其选择器,因此此代码毫无意义。 (我也不知道你为什么选择加入 @synchronized 块。)
[self.tableView performSelectorOnMainThread:@selector(reloadData)
withObject:nil
waitUntilDone:NO];
【讨论】: