__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'的记录值,即使主线程的嵌套回调异步更改值也是如此。关于我哪里出错的任何想法?
答案 0 :(得分:2)
您将异步调度到主队列。该块已入队,dispatch_async()立即返回。假设其余的代码在主线程上运行,那么异步排队的块将不会运行,直到下一次通过主事件循环,直到上面的所有代码执行后才会发生。
为了以这种方式设置标量变量,没有理由将dispatch_async()发送到主线程。只需直接设置变量(因为主线程在dispatch_sync()上被阻止。