Приложение зависло при выборе фотографии из iCloud - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь получить все фотографии с моего устройства и показать их в коллекции:

var allPhotos : PHFetchResult<PHAsset>? = nil  

PHPhotoLibrary.requestAuthorization { status in
    switch status {
    case .authorized:
        let fetchOptions = PHFetchOptions()
        self.allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
        print("Found \(allPhotos.count) assets")
    case .denied, .restricted:
        print("Not allowed")
    case .notDetermined:
        // Should not see this when requesting
        print("Not determined yet")
    }
}

Этот код выбирает все фотографии как с устройства, так и из iCloud, а затем сохраняет их вallPhotos массив.Но когда я пытаюсь установить их с помощью этой функции в ячейке просмотра коллекции, я получаю только фотографии с устройства.Остальная ячейка с фотографиями пуста.Преобразование изображений с помощью этой функции:

func getUIImage(asset: PHAsset) -> UIImage? {

    var img: UIImage?
    let manager = PHImageManager.default()
    let options = PHImageRequestOptions()
    options.version = .original
    options.isSynchronous = true
    manager.requestImageData(for: asset, options: options) { data, _, _, _ in

        if let data = data {
            img = UIImage(data: data)
        }
    }
    return img
}

И для некоторых изображений я получаю эту ошибку "Не удалось загрузить данные изображения для ресурса" для этих пустых ячеек.Может кто-нибудь объяснить, почему он не загружает изображения iCloud?

1 Ответ

0 голосов
/ 04 февраля 2019

Поскольку следующий код является замыканием.

manager.requestImageData(for: asset, options: options) { data, _, _, _ in

    if let data = data {
        img = UIImage(data: data)
    }
}

И замыкания выполняются в фоновом потоке и не являются встроенными.Выполнение закрытия может занять некоторое время и может не вернуть данные мгновенно.

Вы можете попробовать создать обратный вызов закрытия для загрузки изображения.

func getUIImage(asset: PHAsset, complition : @escaping ((_ img:UIImage?,_ error:String?) -> Void)){
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
options.version = .original
options.isSynchronous = true
manager.requestImageData(for: asset, options: options) { data, _, _, _ in

    if let data = data,
    let img = UIImage(data: data){
        complition(img,nil)
    }else{
        complition(nil,"Something went wrong")
        }
    }
}

Вы можете попробовать это.Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...