2012-08-05 55 views
0

我想弄清楚这段代码是否正在更新主线程上的UI。此代码位于专门用于下载JSON供稿的类中。获取数据后,我解析它以返回一个数组,我将用它来更新UI,然后让委托人知道数据已准备就绪。我的委托人,一个视图控制器,将使用这个数组来更新用户界面。我是否需要在dispatch_get_main_queue块中执行-parser:didFinishParsingWithResults:?或者是没有必要,因为我更新视图控制器类中的用户界面,而不是这个类?谢谢!GCD和代理线程?

__block NSArray *results; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    NSData *responseData = [NSData dataWithContentsOfURL:url]; 
    results = [self parseData:responseData]; 
    [self.delegate parser:self didFinishParsingWithResults:results]; 
}); 

回答

3
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

这不是主线程。这是默认的优先级全局队列,可能是任何线程。

如果parser:didFinishParsingWithResults:在没有调度到主队列/线程的情况下废除了UI元素,那么您遇到了问题。

+0

Got it!我只是不确定是否告诉代表意味着它会自动返回主线程。不知道我为什么做出这样的假设。谢谢。 – 2012-08-05 05:45:04

2

绝对使用dispatch_get_main_queue()更新您的用户界面,该代码不是线程安全的,因此您总是希望在主线程上更新您的用户界面。我很难学会这一点:-)