ios - GCD取消异步 block ?

标签 ios iphone objective-c macos cocoa

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

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

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

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

之前检查是否设置了标志

最佳答案

要使用 GCD 来实现它,您必须使用自己的原子标志。

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

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

关于ios - GCD取消异步 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21795882/

相关文章:

ios - Firebase InApp Messaging 无法加载测试消息[资源包丢失]

iphone - 使用 UIPopoverController 时出错

ios - MKMapItem 未在 MKPlacemark 上显示正确的信息

ios - 输入处理 iOS 设置页面

ios - 如何显示倾斜的imageview?

ios - 为什么当我的动画所在的 View 是从模态转场中调用时,我的动画都不播放?

iphone - 列出目录下的文件,不包括隐藏文件,并且不遍历子文件夹

ios - 使用 Xcode 6 在 UICollectionView 中继续

ios - Xcode - 单击按钮更改按钮背景颜色

iphone - 如何将文件从 S3 下载到 iPhone 应用程序?