GCD取消异步阻止?

时间:2014-02-15 09:44:22

标签: ios iphone objective-c macos cocoa

我有常规代码用于在表格视图单元格中加载图像

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSImage *image = file.image;
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = image;
        });
    });

问题是当我滚动太快时,我可以看到最后一个块在同一个imageView上多次触发。这看起来很奇怪。在安排新的imageView之前,有没有办法取消所有先前安排的Grand Central Dispatch操作(假设它们都具有唯一ID)?

我的意思是,我想确保只应执行上次计划的操作,并且应该删除之前安排的所有操作。这可能通过imageView.image = image;来实现吗?或者我必须将自己的原子标志添加到imageView对象,并在调用{{1}}之前检查是否设置了标志

2 个答案:

答案 0 :(得分:7)

要使用GCD来实现它,你必须使用自己的原子旗。

但是有一个更好的解决方案,您可以取消开箱即用的任务。这是一个NSOperationQueue。

您可以在此链接下阅读所需内容:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

答案 1 :(得分:2)

有人已经说过,但在管理密集的网络电话时,使用[[NSOperationQueue mainQueue] cancelAllOperations]; 取消操作对我来说就像是一种魅力。