我在ViewController init方法中调用以下Class方法:
[NSURLConnection sendAsynchronousRequest:urlrequest
queue:opQueue
completionHandler:^(NSURLResponse *response, NSData *data, NSError*error){
// Update an NSMutableArray (an Instance variable
[self tableView] reloadData]; // is this ok to call?
}];
此代码按预期工作,tableView适当刷新,我担心:这个调用线程安全吗?可以从完成块访问UI元素吗?
谢谢,
维诺德
答案 0 :(得分:8)
实际上,这是不正确的,除非opQueue碰巧是+ [NSOperationQueue mainQueue]
将在您提供的队列上安排完成块。在您的情况下,您正在调用该队列'opQueue'。如果该队列被主线程以外的某个线程耗尽,那么你不应该调用那里重新加载tableview。
您应该执行您需要执行的任何处理,然后在主队列上排队另一个调用重新加载的块。
^(NSURLResponse *response, NSData *data, NSError*error){
// Do some processing work in your completion block
dispatch_async(dispatch_get_main_queue(), ^{
// Back on the main thread, ask the tableview to reload itself.
[someTableView reloadData];
});
}
或者如果处理轻松快速(并且固定的时间量),那么只需将mainQueue作为'opQueue'传递;
我希望这是有道理的。这里有很多好的信息:Concurrency Programming Guide
答案 1 :(得分:1)
它是线程安全的。非常因为你没有使用线程。稍后调用完成处理程序,而不是在单独的线程上调用。