【问题标题】:GCD cancel async block?GCD取消异步块?
【发布时间】:2014-03-14 18:56:46
【问题描述】:

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

    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 的所有先前安排的操作(假设它们都有唯一的 id)?

我的意思是,我想确保只执行最后一次计划的操作,并且应该删除所有之前计划的操作。可以通过Grand Central Dispatch 实现吗?或者我必须在 imageView 对象中添加我自己的原子标志,并在调用imageView.image = image;之前检查是否设置了标志@

【问题讨论】:

  • 如果您同步执行所有这些操作,图像加载真的那么慢吗?

标签: ios iphone objective-c macos cocoa


【解决方案1】:

要使用 GCD 进行归档,您必须使用自己的原子标志。

但是有一个更好的解决方案,您可以立即取消任务。它是一个 NSOperationQueue。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多