2017-09-23 17 views
7

Po aktualizacji do iOS 11, aktywa zdjęcia teraz załadować powoli, a ja ten komunikat w konsoli:iOS 11: [ImageManager] Nie można załadować danych obrazowych

[ImageManager] Nie można załadować danych obrazowych, /var/mobile/media/DCIM/103APPLE/IMG_3064.JPG

używam funkcję statycznego, aby załadować obraz:

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 
} 

Prześlij zdjęcie aktywów zwykle zawsze się powiedzie, ale drukuje tę wiadomość. Jeśli używam tylko funkcji requestImageData, nie ma takiej wiadomości, ale zdjęcia zrobione kamerą Apple tracą orientację, a podczas ładowania dużej ilości zdjęć uzyskuję jeszcze więcej problemów (korzystam z pokazu slajdów w mojej aplikacji).

Apple zawsze jest do bani, jeśli chodzi o aktualizacje, może ktoś ma rozwiązanie, jak to naprawić? Nie można nawet załadować zasobu, gdy istnieje duża lista z nich w kamerze użytkownika. Przełączenie na requestImageData nie jest dla mnie opcją, ponieważ często dostarcza teraz dane zerowe.

Chciałbym podkreślić, że tę funkcję nazywam tylko raz. Nie jest on używany w UITableView itp. Używam innego kodu dla kciuków z zainicjowanym globalnie menedżerem i opcjami, więc zasoby zdecydowanie nie są zerowe lub itp. Ta funkcja jest wywoływana tylko wtedy, gdy użytkownik kliknie na określony kciuk. Gdy galeria ma 5000 zdjęć, może połączenie z zasobami jest po prostu przeciążone, a później nie może obsłużyć żądania i awarii? Tyle pytań.

+0

widzę ten sam problem, ponieważ uaktualnienie do iOS 11. Gdybym zażądać wystarczająco mały rozmiar (256 x 256) do miniaturek, wszystkie one obciążenia. Kiedy używam tego samego kodu dla większego rozmiaru, to zawiedzie on o około 20%. Nie znalazłem jeszcze żadnego wzoru. – user1055568

+0

Czy znalazłeś poprawkę? – kye

+0

Niezupełnie, ostrzeżenie jest nadal trwałe. –

Odpowiedz

-2

Wydaje się, że jest to błąd w systemie iOS 11, ale udało mi się obejść, ustawiając opcję synchroniczną false. Przebudowałem swój kod, aby poradzić sobie z dostarczaniem asynchronicznym. Prawdopodobnie możesz użyć synchronizacji (wykonaj :) aby szybko naprawić.

Sądzę, że problem wystąpił tylko w przypadku zdjęć dostarczonych przez udostępnianie usługi iCloud.

+2

To nie działa dla mnie. Wydaje się jednak, że optymalizacja połączeń ze strukturą Zdjęć zwiększyła ogólną wydajność. Teraz pobieram zasoby OperationQueue, a później ustawiam je asynchronicznie na elementach UI. Mam wyłączone zdjęcia sieciowe, więc zdecydowanie nie są one w iCloud i synchronizacja/asynchroniczne działa prawie tak samo dla mnie. Wygląda na to, że jest to kolejny błąd iOS, teraz zasoby działają znacznie wolniej niż wcześniej. –

+0

Sądzę, że asynchronizacja na początku też nie działała, chociaż nie pamiętam, co zmieniłem, aby działało. Obecnie działa ustawienie deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic, contentMode PHImageContentModeAspectFill. Wiadomość dziennika będzie nadal wyświetlana, ale ostatecznie pojawi się obraz w pełnym rozmiarze. – user1055568

0

Możesz wypróbować metodę "requestImageData" z następującymi opcjami. To działało dla mnie w iOS 11.2 (zarówno na urządzeniu, jak i na symulatorze).

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 
Powiązane problemy