如何通过GCD中的块来取消前一个块?

时间:2012-09-13 08:38:18

标签: iphone ios grand-central-dispatch nsthread

  

可能重复:
  How do I kill/suspend/close an asyncronous block in GCD?

我正在处理一个执行图像处理并显示结果图像的应用。我使用UIScrollView让用户滚动所有图像,因为图像不是标准的jpg或png,加载需要时间。我使用GCD异步加载,当完成调度到主队列显示时。摘录如下:

- (void)loadImage:(NSString *)name
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImage *image = [Reader loadImage:name];
        dispatch_sync(dispatch_get_main_queue(), ^{
            [self displayImage:image];
        });
    });
}

这在大多数情况下效果很好。但是当您滚动得太快以至于在第一个加载的图像显示之前可能会多次调用该方法。然后当您停止时,当前的imageView将快速显示多个先前的图像,然后最后显示当前图像。由于记忆问题很容易崩溃。

我想知道如果队列中有新块(这意味着在前一个块完成之前再次调用该方法),是否有办法通知队列取消之前的队列?还是其他更好的建议?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您正在使用类方法来加载图像,但是同时从各个线程(通过块)调用它们,所以我希望您为此设计了Reader。在任何情况下,我建议你做的是创建一个可变集,每次你发送消息阅读器来加载图像,首先将名称添加到集。当它返回时,然后在主线程上删除名称(在mainQueue或主线程上完成添加和删除。

现在,当您想要停止处理一个或所有图片时,请添加一个新的' cancelLoad' Reader的方法,并向其发送您希望它停止处理的名称列表。