如何取消NSOperationQueue

时间:2013-01-21 03:17:12

标签: iphone ios cocoa-touch nsoperationqueue

想知道我是否正确实现了以下方法,因为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];
}

1 个答案:

答案 0 :(得分:1)

发现问题,必须更换:

__unsafe_unretained NSBlockOperation *weakOperation = operation;

使用:

__block NSBlockOperation *weakOperation = operation;
BTW,对于任何有兴趣的人来说,有一个很好的并发视频,特别是在一个单独的线程上绘制,并在WWDC2012中使用NSOperationQueue称为在IOS上构建并发用户界面。