我查看了 WWDC 2010 的一些演示文稿,还阅读了大部分关于块和并发的文档,并且有几个关于在 Grand Central Dispatch 中使用带有串行队列的块的问题。我有一个 iOS 4 项目,它有一个滚动视图和一个图像信息字典——图像的 URL 等等。我想使用 GCD 和块来下载图像并将它们放在我的滚动视图中,因此不会阻塞主线程。我编写了以下似乎有效的代码:
for (NSDictionary* dict in images)
{
dispatch_async(image_queue, ^{
NSString* urlString = [dict objectForKey:@"url"];
NSURL* url = [NSURL URLWithString:urlString];
NSData* imageData = [[NSData alloc] initWithContentsOfURL:url];
UIImage* image = [UIImage imageWithData:imageData];
UIImageView* imageView = // initialize imageView with image;
dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView addSubview:imageView];
});
[imageData release];
});
}
我有两个问题:
根据并发指南,我不应该从封闭范围中捕获非标量类型的变量 - 在我的代码中,我捕获 dict 这是一个 NSDictionary* 对象。如果我不允许捕获它,我应该如何编写代码?块是否仅捕获实际使用的封闭范围中的变量?
如果我在通过串行调度队列获取所有图像之前离开当前的 ViewController 会发生什么?我不认为他们知道创建它们的 ViewController 已经消失了,所以当他们执行完成处理程序时会发生什么,我将图像视图插入到主线程上的滚动视图中?它会导致错误还是什么?当我的 ViewController 消失时,如何取消串行队列上的任何剩余操作?
此致,