web-dev-qa-db-fra.com

iOS 11: [ImageManager] Impossible de charger les données d'image

Après la mise à jour vers iOS 11, les ressources photo se chargent maintenant lentement et le message suivant apparaît dans la console:

[ImageManager] Impossible de charger les données d'image, /var/mobile/Media/DCIM/103Apple/IMG_3064.JPG

J'utilise une fonction statique pour charger l'image:

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
}

La demande d’image pour la ressource réussit toujours toujours, mais elle affiche ce message. Si j'utilise uniquement la fonction requestImageData, il n'y a pas de message de ce type, mais les photos prises avec un appareil photo Apple perdent leur orientation et je rencontre encore plus de problèmes lorsque je charge un grand nombre d'images (j'utilise le diaporama d'images dans mon application).

Apple est toujours nul quand il s'agit de mises à jour, peut-être que quelqu'un a une solution pour résoudre ce problème? Il ne parvient même pas à charger un actif, quand il y a une grande liste d'entre eux dans la caméra de l'utilisateur. Passer à requestImageData n'est pas une option pour moi car il apporte fréquemment des données nulles maintenant.

Je tiens à souligner que je n’appelle cette fonction qu’une fois. Elle n’est pas utilisée dans UITableView, etc. J’utilise un autre code pour les pouces avec un gestionnaire et des options globalement initialisés, de sorte que les ressources ne sont définitivement ni nuls, ni etc . Lorsque la galerie a environ 5 000 photos, la connexion aux ressources est peut-être simplement surchargée et qu’elle ne peut plus gérer les demandes et les blocages plus tard? Autant de questions.

16
Bio-Matic

Hé, je recevais aussi l'avertissement et voici ce qui a fonctionné pour moi.

Le remplacement de CGSize(width: asset.pixelWidth, height: asset.pixelHeight) Par PHImageManagerMaximumSize dans l'appel requestImage A supprimé le journal d'avertissement ????

J'espère que cela t'aides,

7
sachadso

J'ai eu le même problème. Bien que cela n'ait pas complètement résolu le problème, cela a certainement aidé.

option.isNetworkAccessAllowed = true

Cela n'est utile que sur les appareils sur lesquels l'option Optimiser le stockage iPhone pour l'application Photos a été activée.

2
Mitul Jindal

Votre code a de sérieux problèmes. Vous dites .isSynchronous = true sans entrer dans un thread d'arrière-plan pour effectuer l'extraction. C'est illégal et c'est ce qui cause la lenteur. De plus, vous demandez une targetSize sans également dire .resizeMode = .exact, ce qui signifie que vous obtenez des images beaucoup plus grandes que ce que vous demandez.

Cependant, l’avertissement que vous voyez n’est pas pertinent et peut être ignoré. Cela ne signifie en aucun cas une défaillance de la livraison des images; il semble qu’il s’agisse d’un message interne qui a été transmis par erreur à la console.

1
matt

Vous pouvez essayer la méthode "requestImageData" avec les options suivantes. Cela a fonctionné pour moi dans iOS 11.2 (à la fois sur le périphérique et le simulateur). 

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

Cela semble être un bogue avec iOS 11, mais j'ai découvert que je pouvais contourner le problème en définissant l'option synchrone sur false. J'ai retravaillé mon code pour gérer la livraison asynchrone. Vous pouvez probablement utiliser sync (execute :) pour une réparation rapide.

De plus, je pense que le problème ne concerne que les photos fournies par le partage iCloud.

0
user1055568