【问题标题】:iOS 11: [ImageManager] Unable to load image dataiOS 11:[ImageManager] 无法加载图像数据
【发布时间】:2018-03-04 19:21:50
【问题描述】:

更新到 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 对我来说不是一个选项,因为它现在经常带来 nil 数据。

我想指出,我只调用了这个函数一次。它不在 UITableView 等中使用。我将其他代码用于带有全局初始化管理器和选项的拇指,因此资产绝对不是 nil 等。 我仅在用户单击某个拇指时才调用此函数。 当画廊有 5000 张照片时,可能与资产的连接只是过载,后来它无法处理请求并崩溃? 这么多问题。

【问题讨论】:

  • 自从升级到 iOS 11 后,我看到了同样的问题。如果我要求缩略图的尺寸足够小 (256 x 256),它们都会加载。当我对更大的尺寸使用相同的代码时,它会在大约 20% 时失败。还没想出什么规律。
  • 您找到解决方法了吗?
  • 并非如此,警告仍然存在。
  • 你找到解决办法了吗?
  • @LaurentCrivello,在 swift 中没有像 autoreleasepool 这样的东西。我之前已经看过那个解决方案了。

标签: swift uiimage gallery ios11 phasset


【解决方案1】:

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

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

希望这会有所帮助,

【讨论】:

  • 现在你收到了一个你不需要也不想要的浪费大量内存的图像。为什么这是解决任何问题的方法?我宁愿看到警告(并忽略它)。
【解决方案2】:

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

option.isNetworkAccessAllowed = true

这仅在启用了“为照片应用优化 iPhone 存储”选项的设备上有所帮助。

【讨论】:

  • 对我来说它不起作用,因为我也在我的设备中使用了 iCloud 照片。这可能是与操作系统相关的错误。
  • 谢谢!修复了我一整天都在寻找的仅在一部 iPhone 上发生的错误。
  • 谢谢。有用。我还必须设置选项 option.version = .original 以加载原始大小的图像,而不仅仅是缩略图。
【解决方案3】:

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

但是,您看到的警告无关紧要,可以忽略。它绝不表示图像传输失败;似乎只是一些内部消息错误地传到了控制台。

【讨论】:

  • 这个确切的代码用于获取完整尺寸的图像。而且这个函数本身是从后台线程调用的。
  • 我回答的重点是警告不是你的错误。图像到达,所以忽略警告。
【解决方案4】:

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

另外,我认为问题只发生在通过 iCloud 共享传递的照片上。

【讨论】:

  • 它对我不起作用。然而,优化对照片框架的调用似乎提高了整体性能。现在我获取资产 OperationQueue,然后在 UI 项目上将它们设置为异步。我禁用了网络照片,因此它们绝对不在 iCloud 中,并且同步/异步对我来说几乎相同。这似乎是另一个 iOS 错误,现在资产的运行速度比以前慢了很多。
  • 我相信一开始异步对我也不起作用,虽然我不记得我做了什么改变使它起作用。现在的工作是设置 deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic, contentMode PHImageContentModeAspectFill。日志消息仍会出现,但最终会出现完整尺寸的图像。
【解决方案5】:

您可以尝试使用以下选项的方法“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

【讨论】:

  • 同步图像请求如果不在后台线程完成,会阻塞主线程
  • @thedeveloper3124 在我的情况下,用户正在等待选择后的图像,因此同步使用它。异步,花费太多时间或似乎没有给出图像。
猜你喜欢
  • 2014-11-10
  • 1970-01-01
  • 2020-11-15
  • 2012-07-10
  • 2015-12-26
  • 2015-01-10
  • 2019-11-13
  • 2013-03-30
  • 1970-01-01
相关资源
最近更新 更多