iOS 11:[ImageManager]无法加载图片数据

时间:2017-09-23 08:55:58

标签: swift uiimage gallery ios11 phasset

更新到iOS 11后,照片资源现在加载缓慢,我在控制台中收到此消息:

  

[ImageManager]无法加载图片数据,   /var/mobile/Media/DCIM/103APPLE/IMG_3064.JPG

我使用静态函数加载图片:

class func getAssetImage(asset: PHAsset, size: CGSize = CGSize.zero) -> UIImage? {
    let manager = PHImageManager.default()
    let option = PHImageRequestOptions()
    option.isSynchronous = true

    var assetImage: UIImage!
    var scaleSize = size
    if size == CGSize.zero {
        scaleSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
    }

    manager.requestImage(for: asset, targetSize: scaleSize, contentMode: .aspectFit, options: option) { (image, nil) in
        if let image = image {
            assetImage = image
        }
    }
    if assetImage == nil {
        manager.requestImageData(for: asset, options: option, resultHandler: { (data, _, orientation, _) in
            if let data = data {
                if let image = UIImage.init(data: data) {
                    assetImage = image
                }
            }
        })
    }
    return assetImage
}

资产的请求图像通常总是成功,但它会打印此消息。如果我只使用requestImageData函数,则没有这样的消息,但使用Apple相机拍摄的照片会失去方向,并且在加载大量图像时会出现更多问题(我在我的应用程序中使用图像幻灯片)。

Apple在更新时总是很糟糕,也许有人找到了解决方法如何解决这个问题?当用户相机中存在大量资产时,它甚至无法加载资产。切换到requestImageData对我来说不是一个选项,因为它现在经常带来零数据。

我想指出,我只调用此功能一次。它没有在UITableView等中使用。我使用其他代码用于全局初始化的管理器和选项,因此资产肯定不是零或等等。 我只在用户点击某个拇指时调用此功能。 当画廊有5000张照片时,可能与资产的连接过载,以后它无法处理请求和崩溃? 这么多问题。

5 个答案:

答案 0 :(得分:9)

嘿,我也收到了警告,这对我有用。

更换 CGSize(width: asset.pixelWidth, height: asset.pixelHeight) 通过 PHImageManagerMaximumSize通话中的requestImage 删除了警告日志

希望这会有所帮助,

答案 1 :(得分:3)

我遇到了同样的问题。虽然这并没有完全解决它,但它肯定有帮助。

option.isNetworkAccessAllowed = true

这仅适用于已启用“照片”应用的“优化iPhone存储空间”选项的设备。

答案 2 :(得分:1)

您的代码存在一些严重的问题。您在说.isSynchronous = true时并没有进入后台线程来进行提取。那是非法的,并且是导致速度缓慢的原因。另外,您要的是targetSize而没有说.resizeMode = .exact,这意味着您得到的图像比您要的要大得多。

但是,您看到的警告是不相关的,可以忽略。它绝不表示图像传送失败;似乎只是一些内部消息误将其发送到了控制台。

答案 3 :(得分:0)

这似乎是iOS 11的一个错误,但我发现我可以通过设置同步选项false来解决。我重写了我的代码以处理异步传递。可能你可以使用sync(execute :)来快速修复。

另外,我认为问题只发生在iCloud分享的照片上。

答案 4 :(得分:0)

您可以尝试方法" requestImageData"有以下选项。这在iOS 11.2中适用于我(包括设备和模拟器)。

let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.resizeMode = .exact
options.isSynchronous = true

PHImageManager.default().requestImageData(for: asset, options: options, resultHandler: { (data, dataUTI, orientation, info) in