0
__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' 的记录值,即使主线程的嵌套回调异步更改了值。关于我哪里出错的任何想法?

4

1 回答 1

2

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

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

于 2013-01-04T17:06:48.717 回答