およそ 10% の確率で、PHImageManager.defaultManager().requestImageForAsset は、有効ではあるが「劣化した」UIImage を最初に返した後、有効な UIImage ではなく nil を返します。私が見ることができるエラーやその他の手がかりは、nil の情報には返されません。
これは、iCloud Photo Library と Optimize iPad Storage の両方が有効になっている場合に、iCloud からダウンロードする必要がある写真で発生するようです。オプションやサイズなどを変更してみましたが、何も問題ないようです。
失敗した後に requestImageForAsset を再試行すると、通常は正しく UIImage が返されますが、場合によっては数回再試行する必要があります。
私が間違っているかもしれないことは何ですか?それとも、Photos フレームワークの単なるバグですか?
func photoImage(asset: PHAsset, size: CGSize, contentMode: UIViewContentMode, completionBlock:(image: UIImage, isPlaceholder: Bool) -> Void) -> PHImageRequestID? {
let options = PHImageRequestOptions()
options.networkAccessAllowed = true
options.version = .Current
options.deliveryMode = .Opportunistic
options.resizeMode = .Fast
let requestSize = !CGSizeEqualToSize(size, CGSizeZero) ? size : PHImageManagerMaximumSize
let requestContentMode = contentMode == .ScaleAspectFit ? PHImageContentMode.AspectFit : PHImageContentMode.AspectFill
return PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: requestSize, contentMode: requestContentMode, options: options)
{ (image: UIImage!, info: [NSObject : AnyObject]!) in
if let image = image {
let degraded = info[PHImageResultIsDegradedKey] as? Bool ?? false
completionBlock(image: photoBlock.rotatedImage(image), isPlaceholder: degraded)
} else {
let error = info[PHImageErrorKey] as? NSError
NSLog("Nil image error = \(error?.localizedDescription)")
}
}
}