从completionHandler中调用UIView相关的调用?

时间:2011-12-09 18:32:30

标签: ios nsurlconnection

我在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元素吗?

谢谢,

维诺德

2 个答案:

答案 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)

它是线程安全的。非常因为你没有使用线程。稍后调用完成处理程序,而不是在单独的线程上调用。