2017-09-23 8 views
7

Nach Update auf iOS 11, Foto Assets jetzt lädt langsam zu laden und ich bekomme diese Meldung in der Konsole:iOS 11: [Imagemanager] Unable Bilddaten

[Imagemanager] Unable Bilddaten zu laden, /var/mobile/Medien/DCIM/103APPLE/IMG_3064.JPG

ich verwende statische Funktion Bild zu laden:

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 
} 

anfordern Bild für das Asset in der Regel immer erfolgreich ist, aber es druckt diese Nachricht. Wenn ich nur die requestImageData-Funktion verwende, gibt es keine solche Nachricht, aber Fotos, die mit einer Apple-Kamera erstellt wurden, verlieren ihre Orientierung und ich bekomme beim Laden einer großen Menge von Bildern noch mehr Probleme (ich verwende Bild-Diashow in meiner App).

Apple ist immer nervig, wenn es um Updates geht, vielleicht hat jemand eine Lösung, wie man das beheben kann? Es kann sogar ein Asset nicht laden, wenn es eine große Liste in der Benutzerkamera gibt. Der Wechsel zu requestImageData ist für mich keine Option, da jetzt häufig keine Daten mehr vorhanden sind.

Ich möchte darauf hinweisen, dass ich diese Funktion nur einmal anrufe. Es wird nicht in UITableView usw. verwendet. Ich verwende anderen Code für Thumbs mit global initialisiertem Manager und Optionen, also sind Assets definitiv nicht null oder so. Ich rufe diese Funktion nur dann auf, wenn der Benutzer auf einen bestimmten Daumen klickt. Wenn Galerie wie 5000 Fotos hat, ist möglicherweise Verbindung zu Assets nur überlastet und später kann es nicht mit Anfragen und Abstürzen umgehen? So viele Fragen.

+0

Ich sehe das gleiche Problem seit dem Upgrade auf iOS 11. Wenn ich eine kleine Größe (256 x 256) für Thumbnails anfordern, werden alle geladen. Wenn ich denselben Code für eine größere Größe verwende, scheitert es an ungefähr 20%. Hab noch kein Muster herausgefunden. – user1055568

+0

Haben Sie eine Lösung gefunden? – kye

+0

Nicht wirklich, Warnung ist immer noch hartnäckig. –

Antwort

-2

Dies scheint ein Fehler mit iOS 11 zu sein, aber ich fand, dass ich umgehen könnte, indem ich synchrone Option false setzte. Ich habe meinen Code überarbeitet, um mit der asynchronen Zustellung fertig zu werden. Wahrscheinlich können Sie sync (execute :) für eine schnelle Lösung verwenden.

Auch ich glaube, das Problem trat nur bei Fotos auf, die von iCloud freigegeben wurden.

+2

Es hat nicht für mich funktioniert. Es scheint jedoch, dass die Optimierung der Aufrufe von Photos Framework die Gesamtleistung erhöht. Jetzt hole ich Assets OperationQueue und später setze ich sie async auf UI-Elemente. Ich habe Netzwerkfotos deaktiviert, also sind sie definitiv nicht in der iCloud und sync/async funktioniert für mich ziemlich gleich. Es scheint, dass es ein weiterer iOS-Fehler ist, jetzt arbeiten Assets viel langsamer als zuvor. –

+0

Ich glaube, dass Async für mich auch nicht funktioniert hat, obwohl ich mich nicht daran erinnern kann, was ich geändert habe, damit es funktioniert. Was jetzt funktioniert, ist deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic, contentMode PHImageContentModeAspectFill. Die Protokollmeldung wird weiterhin angezeigt, aber schließlich wird das Bild in voller Größe angezeigt. – user1055568

0

Sie können die Methode "requestImageData" mit folgenden Optionen ausprobieren. Das funktionierte für mich in iOS 11.2 (sowohl auf Gerät als auch auf Simulator).

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