dipatch_async释放局部变量

bac*_*plz 0 cocoa multithreading objective-c objective-c-blocks

我没有在网上找到任何合适的答案,所以我在这里发布我的问题.

__block int test = 1;
dispatch_async(dispatch_get_main_queue(), ^{
    test = 2;
});
NSLog(@"%i",test);
Run Code Online (Sandbox Code Playgroud)

此代码将导致控制台消息"1".

__block NSString *test = @"no";
dispatch_async(dispatch_get_main_queue(), ^{
    test = @"yes";
});
NSLog(@"%@",test);
Run Code Online (Sandbox Code Playgroud)

此代码将导致控制台消息"no".

为什么会这样?我认为__block标识符应解决这种情况下的所有问题.我的假设是复制了局部变量,并且块内的代码实际上并没有修改自身之外的任何东西.

如何在dispatch_async中修改局部变量?

对不起,如果这是一个菜鸟问题.

bbu*_*bum 10

您将异步调度到主队列.

dispatch_async该块之前返回被执行(巧合).

为了强调非确定性并发编程可以如何:

请注意,您NSLog()可能有时会在一个非常蓝色的月亮中看到新值.您可能永远不会在调试环境中看到它,但是一些客户可能会在3年后就系统配置遇到这种行为,这种情况今天不存在.

修理?

dispatch_sync() 从而确保您的后台队列和主队列有效地像一个效率较低的单个串行队列.

... 要么 ...

在操作完成后,使用某种同步构造从主队列发送回本地队列.即:

dispatch_async(otherQueue, ^{
     ... do something ...;
     dispatch_async(firstQueue, ^{
          done(calculatedValue);
     };
};
Run Code Online (Sandbox Code Playgroud)