iOS Programming with GCD



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

然而,有时图像需要一些时间才能从互联网上加载。如果用户点击某个地方,视图控制器改变到别的地方,我就会发现一些奇怪的行为,甚至我的应用会崩溃。我想原因是我指的是自我。但当前视图控制器没有这个属性。或者还有其他可能性吗?有什么建议吗?

提前感谢!


对不起,我没有在这里包含代码。下面是代码:

- (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);
}

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

对于Blocks/GCD,你可能想要在某个对象上有一个"isCanceled"——最好是在代表后台取回的对象上——然后在可能的情况下检查它,以确定响应是否仍然相关。

最新更新