我的问题是我正在使用 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/