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枚の写真がある場合、アセットへの接続が過負荷になっていて、後でリクエストやクラッシュを処理できませんか?非常に多くの質問。
ちょっと私も警告を受けていたので、ここに私のために働いたものがあります。
CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
をPHImageManagerMaximumSize
呼び出しのrequestImage
に置き換えると、警告ログが削除されました????
お役に立てれば、
同じ問題がありました。これは完全には解決しませんでしたが、確かに役立ちました。
option.isNetworkAccessAllowed = true
これは、写真アプリの[iPhoneストレージの最適化]オプションがオンになっているデバイスでのみ役立ちます。
コードには重大な問題があります。 .isSynchronous = true
と言っているのは、フェッチを行うためにバックグラウンドスレッドにステップインすることはありません。それは違法であり、遅延の原因となっています。さらに、.resizeMode = .exact
も言わずにtargetSize
を要求しているため、要求しているよりもはるかに大きな画像を取得しています。
ただし、表示されている警告は無関係であり、無視してかまいません。画像配信の失敗を示すものではありません。それは誤ってコンソールにだまされた内部メッセージのようです。
次のオプションを使用して、メソッド「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
これはiOS 11のバグのようですが、同期オプションをfalseに設定することで回避できることがわかりました。非同期配信に対処するためにコードを修正しました。おそらく、すぐに修正するためにsync(execute :)を使用できます。
また、問題はiCloud共有によって配信された写真でのみ発生したと考えています。