UICollectionView在重新加载时选择indexPath处的单元格

时间:2014-05-06 11:52:31

标签: ios objective-c uicollectionview reloaddata

我有收集视图来显示来自服务器的照片 从服务器下载很慢,我想在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];
     });
 }

这很有效,但我无法在索引路径中为行选择单元格,直到下载完成为止 如何在下载完成前选择单元格,以查看已下载的照片?

1 个答案:

答案 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选项:

     

此标志指示枚举块调用可以分布在多个线程上,如果块代码特别是处理器密集型,则可能会提高性能。请注意,使用此选项时,枚举顺序未定义。