PHImageManager请求iCloud照片的图片时有时会返回空值。

59

大约有10%的时间,PHImageManager.defaultManager().requestImageForAsset在首先返回有效但“降级”的UIImage后,返回nil而不是一个有效的UIImage。我无法在nil中看到任何错误或其他提示。

这似乎发生在需要从iCloud下载照片时,启用了iCloud照片库和优化iPad存储。我已经尝试更改选项、大小等,但似乎都没有影响。

如果在失败后重试requestImageForAsset请求,通常会正确返回UIImage,但有时需要多次重试。

我做错了什么?还是这只是Photos框架中的一个bug?

    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)")
           }
    }
}

我有完全相同的问题,你找到任何解决方案了吗? - dlinsin
1
我也遇到了同样的问题。我认为这是一个 bug,并已经提交了一个 bug 报告。 - Jordan H
4
当我将 options.deliveryMode 设为 HighQualityFormat 时,我看到了这种情况发生,但是当我将它设为 Opportunistic 时却没有。 - Alfie Hanssen
@AlfieHanssen,对我来说没有任何区别。 - Jonathan Crooke
有人能告诉我如何解决这个问题吗?https://stackoverflow.com/questions/55488998/how-to-fix-empty-asset-issue-with-phimagemanager-in-assetspickercontroller-ios?我也遇到了视频的同样问题。 - user2786
@dlinsin,Jordan H,Lenk,你们有没有解决这个问题的方案? - Dixit Akabari
11个回答

0

我在获取iCloud图片时也得到了nil。无论是使用requestImage还是requestImageData方法的哪种类型都没有区别。结果发现,我的设备通过Charles代理连接到网络,因为我想监视应用程序发出的请求和响应。由于某种原因,如果以这种方式连接,则设备无法与iCloud一起使用。一旦关闭代理应用程序,就可以获取iCloud图片。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接