我有这个dispatch_queue
代码,我用它来发出3个不同的数据请求。然后我正在更新主线程上的tableView
。我还可以在主线程中添加什么?我正在使用此[self requestExtendedData];
从Web服务下载数据,然后将其解析并设置为UILabels等...
我的问题是:如果我在后台线程中运行[self requestExtendedData];
如何在主线程中使用此数据中的内容更新UILabels?我应该把所有其他东西放在主线程区吗?所有UIView,UILabels和UIButton对象等......
感谢您的帮助
dispatch_queue_t jsonParsingQueue = dispatch_queue_create("jsonParsingQueue", NULL);
// execute a task on that queue asynchronously
dispatch_async(jsonParsingQueue, ^{
[self requestUserData]; // request user comments data
[self requestExtendedData]; // request extended listing info data
[self requestPhotoData]; // request photo data
// once this is done, if you need to you can call
// some code on a main thread (delegates, notifications, UI updates...)
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
// release the dispatch queue
dispatch_release(jsonParsingQueue);
答案 0 :(得分:2)
这是苹果文件所说的:
注意:在大多数情况下,UIKit类只能从应用程序的主线程中使用。对于从UIResponder派生的类或者涉及以任何方式操纵应用程序的用户界面的类,尤其如此。
这意味着您应该将所有UIView
,UILabels
和UIButton
对象代码放在主线程中,如下所示:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
// Your UI update code here
});
答案 1 :(得分:0)
在dispatch_async
之后尝试这样的事情[self performSelectorOnMainThread:@selector(doUIStuffOnMainThread:)
withObject:self.tableView.data
waitUntilDone:YES];
答案 2 :(得分:0)
[your_tableview performSelectorOnMainThread:@selector(reloadData) withObject:无 waitUntilDone:YES];
答案 3 :(得分:0)
对于Swift3:
DispatchQueue.main.async{
self.tableView.reloadData()
// any UI related code
self.label.text = "Title"
self.collectionView.reloadData()
}
答案 4 :(得分:0)
尝试添加一个主队列操作,如下所示:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.tableView reloadData];
}];