我有收集视图来显示来自服务器的照片
从服务器下载很慢,我想在CollectionView中显示新下载的照片
我每次下载照片时都会重新加载此代码。
for (int x = 0; x < thumbsLink.count; x++)
{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[thumbsLink objectAtIndex:x]]];
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^
{
[thumbs addObject:image];
[self.collectionView reloadData];
});
}
这很有效,但我无法在索引路径中为行选择单元格,直到下载完成为止 如何在下载完成前选择单元格,以查看已下载的照片?
答案 0 :(得分:1)
因为您确实在主线程而不是异步线程上工作。
您应该将代码更改为:
ClassOfSelf * __weak weakSelf = self;
for (int x = 0; x < thumbsLink.count; x++)
{
dispatch_async(dispatch_get_main_queue(), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[thumbsLink objectAtIndex:x]]];
UIImage *image = [UIImage imageWithData:data];
[thumbs addObject:image];
[[weakSelf collectionView] reloadData];
});
}
您还需要使用weak
自我参考来避免强烈的参考周期。
您也可以在并发枚举块中执行此操作:
ClassOfSelf * __weak weakSelf = self;
[thumbsLink enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:obj]];
UIImage *image = [UIImage imageWithData:data];
[thumbs addObject:image];
[[weakSelf collectionView] reloadData];
}];
来自Apple的文档:
如果枚举块中的代码是处理器密集型的 - 并且对于并发执行是安全的 - 您可以使用NSEnumerationConcurrent选项:
此标志指示枚举块调用可以分布在多个线程上,如果块代码特别是处理器密集型,则可能会提高性能。请注意,使用此选项时,枚举顺序未定义。