iphone - 来自 GCD 的线程读取旧值

标签 iphone objective-c ios

我的问题是我正在使用 dispatch_async(dispatch_get_main_queue(), ^(void) { ... }); 异步调用一个方法,在这个方法中取决于我设置的一些条件YES 的 bool 值。在此方法中读取此 bool 值时,它总是由它的旧值读取,即 NO

奇怪的是,当我在检查 bool 的行上设置断点时,一切都按预期进行得很顺利!

编辑: 这是生成线程的代码

dispatch_async(dispatch_get_main_queue(), ^(void) {
    [self drawFaceBoxesForFeatures:features forVideoBox:claporientation:curDeviceOrientation image:img];
});

方法本身

- (void)drawFaceBoxesForFeatures:(NSArray *)features forVideoBox:(CGRect)clap orientation:    (UIDeviceOrientation)orientation image:(UIImage *)image;
{
    if (![self getSendingRequestStatus]) {
        NSLog(@"Sending req");
        // send async request

         dispatch_async(dispatch_get_main_queue(),^ {
             sendingRequest = YES;
         } );
      }
}

最佳答案

看起来您正在修改在 block 内的 block 外创建的 ivar。为了做到这一点并让 ivar 保持正确的值,您需要像这样使用 __block 关键字:

@interface MyCoolClass : NSObject {
    @private
    __block int sendingRequest_;
}

正如 Jack Lawrence 在上面的评论中所说,“[运行时] 在那个时间点拍摄所有相关对象/变量的快照”。 __block 标识符将告诉运行时它不应将该 ivar 复制到堆中,并允许您将值分配给 block 内的 sendingRequest_,即使该 block 是简单地在主线程上运行。

可以在 Blocks Programming Guide 中找到很多有用的信息(包括上述信息)。 .

关于iphone - 来自 GCD 的线程读取旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181819/

相关文章:

ios - 在 UIViewController 的 subview 上初始化 xib

iphone - Facebook IOS SDK 可选权限

ios - 确定应用程序是否刚刚下载

objective-c - 如何解决错误 : linker command failed with exit code 1 (use -v to see invocation) in Xcode5

iOS 7 - 使用 MKOverlayRenderer 在 MapKit 上绘制一组坐标

objective-c - 每个核心数据关系都必须有一个逆关系吗?

ios - 如何在自定义流布局中显示或隐藏装饰 View ?

ios - 如何正确隐藏范围按钮

ios - 使用 Action Extension 导入图像 - 本地镜像的 URL 有效但不适用于实际图像数据

iphone - 关闭/显示模态视图 Controller - 内存?