想知道我是否正确实现了以下方法,因为isCancelled
没有取消该线程。我有一个我缩放的图像,当它完成缩放时,调用此方法来更新图像。因此,当用户将手指从按钮上抬起时,会调用此按钮。如果他们在完成之前尝试再次按下按钮,我会在队列上调用cancelAllOperations
但它无法正常工作。甚至不确定cancelAllOperations是否触发了标志,或者我是否需要继续调用它来获得结果。有人对此有任何见解吗?
- (void) refreshImage
{
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__unsafe_unretained NSBlockOperation *weakOperation = operation;
[operation addExecutionBlock:
^{
UIImage *image = [[self.graphicLayer imageForSize:self.size] retain];
if (![weakOperation isCancelled])
{
[[NSOperationQueue mainQueue] addOperationWithBlock:
^{
self.image = image;
[image release];
}];
}
else
{
[image release];
return;
}
}];
[self.queue addOperation: operation];
[operation release];
}
答案 0 :(得分:1)
发现问题,必须更换:
__unsafe_unretained NSBlockOperation *weakOperation = operation;
使用:
__block NSBlockOperation *weakOperation = operation;
BTW,对于任何有兴趣的人来说,有一个很好的并发视频,特别是在一个单独的线程上绘制,并在WWDC2012中使用NSOperationQueue
称为在IOS上构建并发用户界面。