iOS11: [ImageManager] 无法加载图像数据
iOS 11: [ImageManager] Unable to load image data
更新到 iOS 11 后,照片资产现在加载缓慢,我在控制台中收到此消息:
[ImageManager] Unable to load image data,
/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 等中使用。我使用其他代码作为全局初始化管理器和选项的拇指,所以资产绝对不是 nil 等。
只有当用户点击某个拇指时,我才调用这个函数。
当图库有大约 5000 张照片时,也许与资产的连接只是过载,后来它无法处理请求和崩溃?
这么多问题。
这似乎是 iOS 11 的错误,但我发现我可以通过将同步选项设置为 false 来解决这个问题。我修改了我的代码来处理异步交付。也许你可以使用 sync(execute:) 来快速修复。
此外,我认为问题只发生在通过 iCloud 共享传送的照片上。
您可以尝试使用以下选项的方法 "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
我遇到了同样的问题。虽然这并没有完全解决它,但它确实有帮助。
option.isNetworkAccessAllowed = true
这仅对已打开照片应用的优化 iPhone 存储选项的设备有帮助。
嘿,我也收到了警告,这对我有用。
正在替换
CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
经过
PHImageManagerMaximumSize
在 requestImage
通话中
删除了警告日志
希望这对您有所帮助,
您的代码存在一些严重问题。您说的是 .isSynchronous = true
而没有进入后台线程来进行提取。这是非法的,也是导致速度缓慢的原因。另外,您要求 targetSize
而没有说 .resizeMode = .exact
,这意味着您得到的图像比您要求的大得多。
但是,您看到的警告无关紧要,可以忽略。它绝不表示图像传输失败;这似乎只是错误地传送到控制台的一些内部消息。
更新到 iOS 11 后,照片资产现在加载缓慢,我在控制台中收到此消息:
[ImageManager] Unable to load image data, /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 等中使用。我使用其他代码作为全局初始化管理器和选项的拇指,所以资产绝对不是 nil 等。 只有当用户点击某个拇指时,我才调用这个函数。 当图库有大约 5000 张照片时,也许与资产的连接只是过载,后来它无法处理请求和崩溃? 这么多问题。
这似乎是 iOS 11 的错误,但我发现我可以通过将同步选项设置为 false 来解决这个问题。我修改了我的代码来处理异步交付。也许你可以使用 sync(execute:) 来快速修复。
此外,我认为问题只发生在通过 iCloud 共享传送的照片上。
您可以尝试使用以下选项的方法 "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
我遇到了同样的问题。虽然这并没有完全解决它,但它确实有帮助。
option.isNetworkAccessAllowed = true
这仅对已打开照片应用的优化 iPhone 存储选项的设备有帮助。
嘿,我也收到了警告,这对我有用。
正在替换
CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
经过
PHImageManagerMaximumSize
在 requestImage
通话中
删除了警告日志
希望这对您有所帮助,
您的代码存在一些严重问题。您说的是 .isSynchronous = true
而没有进入后台线程来进行提取。这是非法的,也是导致速度缓慢的原因。另外,您要求 targetSize
而没有说 .resizeMode = .exact
,这意味着您得到的图像比您要求的大得多。
但是,您看到的警告无关紧要,可以忽略。它绝不表示图像传输失败;这似乎只是错误地传送到控制台的一些内部消息。