来自调度队列的主线程的嵌套回调不起作用?

时间:2013-01-04 16:53:06

标签: objective-c multithreading objective-c-blocks grand-central-dispatch

__block int x = 5;
dispatch_queue_t abe = dispatch_queue_create([[NSString stringWithFormat:@"abe'sQueue.%@", self] UTF8String], NULL);
dispatch_sync(abe, ^{
    NSLog(@"%@", [self returnSomething]);
    dispatch_async(dispatch_get_main_queue(), ^{
        x = 20;
    });
});

NSLog(@"%d", x);

以上总是导致5是'x'的记录值,即使主线程的嵌套回调异步更改值也是如此。关于我哪里出错的任何想法?

1 个答案:

答案 0 :(得分:2)

您将异步调度到主队列。该块已入队,dispatch_async()立即返回。假设其余的代码在主线程上运行,那么异步排队的块将不会运行,直到下一次通过主事件循环,直到上面的所有代码执行后才会发生。

为了以这种方式设置标量变量,没有理由将dispatch_async()发送到主线程。只需直接设置变量(因为主线程在dispatch_sync()上被阻止。