使用GCD进行iOS编程

时间:2011-12-05 21:00:10

标签: iphone ios grand-central-dispatch

我使用GCD使用dispatch_queueu_create在新队列中从Internet获取一些图像。然后我返回主队列并使用UIImageView使用提取的图像更新dispatch_async。我使用self.imageView来引用主队列中的UIImageView

但是,有时图像需要一些时间才能从Internet加载。如果用户点击某处并且视图控制器更改为其他内容,我发现一些奇怪的行为或我的应用程序甚至崩溃。我想原因是我引用了self.imageView但当前的视图控制器没有该属性。还是其他任何可能性?有什么建议可以解决这个问题吗?

提前致谢!


很抱歉,我这里没有包含代码。这是代码:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    dispatch_queue_t photoFetchQueue = dispatch_queue_create("photo data downloader", NULL);
    dispatch_async(photoFetchQueue, ^{
        NSURL *photoURL = ...;
        NSData *photoData = ...;
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = [UIImage imageWithData:photoData];
            self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
            self.scrollView.zoomScale = 1.0;
            self.scrollView.contentSize = self.imageView.image.size;
            [scrollView zoomToRect:imageView.frame animated:YES];
        });
    });
    dispatch_release(photoFetchQueue);
}

1 个答案:

答案 0 :(得分:4)

您需要取消模式。也就是说,您需要能够取消后台任务。没有代码,很难说最好的方法是什么。如果您使用更高级别的NSOperation API,则它具有取消支持。

对于Blocks / GCD,您可能希望在某个对象上有一个“isCanceled” - 最好是在代表后台获取的对象上 - 然后在可能的情况下检查是否确定响应是仍然相关。