GCD和委托哪个线程?

时间:2012-08-05 05:05:04

标签: objective-c grand-central-dispatch delegation

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

__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];
});

2 个答案:

答案 0 :(得分:3)

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

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

如果parser:didFinishParsingWithResults:在没有调度到主队列/线程的情况下填充了UI元素,那么就会出现问题。

答案 1 :(得分:2)

绝对使用dispatch_get_main_queue()更新您的UI,该代码不是线程安全的,因此您总是希望在主线程上更新您的UI。我学到了很多东西: - )