当我拿出PHAssetCollection
并将其提交给PHAsset.fetchAssetsInAssetCollection:options
时,我会收到PHAsset
的收藏。对于给我的每一个UIImage
,也会给出一个零值。
以下是我的cellForItemAtIndexPath:indexPath
方法。
public override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("AssetCellIdentifier", forIndexPath: indexPath) as? AssetCollectionViewCell;
let asset = self.assetFetchResult!.objectAtIndex(indexPath.row);
self.imageManager.requestImageForAsset(
asset as! PHAsset,
targetSize: CGSize.init(width: asset.pixelWidth, height: asset.pixelHeight),
contentMode: PHImageContentMode.AspectFill,
options: nil) { (image, info) -> Void in
print (image);
if (image == nil) {
return;
}
cell?.assetThumbnail.contentMode = UIViewContentMode.ScaleAspectFit;
cell?.assetThumbnail.image = image;
}
return cell!;
}
如果我不进行零检查
if (image == nil) {
return;
}
然后UICollectionView只呈现任何内容。一旦我添加了nil检查,集合视图就会开始从照片库的资产集合中呈现图像。
为什么总有相同数量的nils给我回复,因为有UIImage
个对象?我的请求中有什么东西让我搞砸了吗?
这是我上面print
调用的输出。
Optional(<UIImage: 0x12f8263d0>, {40, 30})
Optional(<UIImage: 0x12e5265a0>, {40, 30})
Optional(<UIImage: 0x12e664c90>, {40, 30})
Optional(<UIImage: 0x12e74c860>, {40, 30})
Optional(<UIImage: 0x12e58c580>, {40, 30})
Optional(<UIImage: 0x12e60b6f0>, {40, 30})
Optional(<UIImage: 0x12e7657d0>, {40, 30})
Optional(<UIImage: 0x12e6655e0>, {40, 30})
Optional(<UIImage: 0x12e743ca0>, {40, 30})
Optional(<UIImage: 0x12e5fb6e0>, {40, 30})
Optional(<UIImage: 0x12e5fb8e0>, {40, 30})
Optional(<UIImage: 0x12f85f3b0>, {40, 30})
nil
nil
nil
nil
nil
nil
nil
nil
nil
nil
nil
nil
这似乎发生在我给予的每个PHAssetCollection上。
这是我试图复制的WWDC示例中的位。有一件事我注意到它确实是,我不是,正在标记单元格,以防止重写它,如果它被重用。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
AAPLGridViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellReuseIdentifier forIndexPath:indexPath];
// Increment the cell's tag
NSInteger currentTag = cell.tag + 1;
cell.tag = currentTag;
PHAsset *asset = self.assetsFetchResults[indexPath.item];
[self.imageManager requestImageForAsset:asset
targetSize:AssetGridThumbnailSize
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage *result, NSDictionary *info) {
// Only update the thumbnail if the cell tag hasn't changed. Otherwise, the cell has been re-used.
if (cell.tag == currentTag) {
cell.thumbnailImage = result;
}
}];
return cell;
}
答案 0 :(得分:0)
您无法以self.imageManager.requestImageForAsset
中间的方式呼叫cellForItemAtIndexPath
。此方法cellForItemAtIndexPath
立即返回。同时,requestImageForAsset
是异步 - 意味着您的完成处理程序稍后将被称为 。到它被召唤时,我们已经转移到另一个小区;并记住,细胞被重复使用。所以你的整个方法都是荒谬的。
查看Apple的示例代码,了解如何使用图像管理器的缓存版本填充集合视图的单元格。
另外,我注意到你忽略了PHImageRequestOptions。这很重要。你应该仔细考虑你想要的东西。如果您没有设置任何值,这意味着您将面临完成处理程序多次调用的风险,这在我们不再处理此单元格的过程中再次没有意义。< / p>