web-dev-qa-db-ja.com

iOS 11:[ImageManager]画像データをロードできません

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枚の写真がある場合、アセットへの接続が過負荷になっていて、後でリクエストやクラッシュを処理できませんか?非常に多くの質問。

17
Bio-Matic

ちょっと私も警告を受けていたので、ここに私のために働いたものがあります。

CGSize(width: asset.pixelWidth, height: asset.pixelHeight)PHImageManagerMaximumSize呼び出しのrequestImageに置き換えると、警告ログが削除されました????

お役に立てれば、

9
sachadso

同じ問題がありました。これは完全には解決しませんでしたが、確かに役立ちました。

option.isNetworkAccessAllowed = true

これは、写真アプリの[iPhoneストレージの最適化]オプションがオンになっているデバイスでのみ役立ちます。

3
Mitul Jindal

コードには重大な問題があります。 .isSynchronous = trueと言っているのは、フェッチを行うためにバックグラウンドスレッドにステップインすることはありません。それは違法であり、遅延の原因となっています。さらに、.resizeMode = .exactも言わずにtargetSizeを要求しているため、要求しているよりもはるかに大きな画像を取得しています。

ただし、表示されている警告は無関係であり、無視してかまいません。画像配信の失敗を示すものではありません。それは誤ってコンソールにだまされた内部メッセージのようです。

1
matt

次のオプションを使用して、メソッド「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
0
Hitesh

これはiOS 11のバグのようですが、同期オプションをfalseに設定することで回避できることがわかりました。非同期配信に対処するためにコードを修正しました。おそらく、すぐに修正するためにsync(execute :)を使用できます。

また、問題はiCloud共有によって配信された写真でのみ発生したと考えています。

0
user1055568