当我从iCloud选择照片时,应用程序崩溃

时间:2019-02-04 16:53:05

标签: ios swift photokit

我正在尝试从设备中获取所有照片,并将它们显示在一个收藏夹中:

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 :(得分:3)

因为以下代码是闭包。

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")
        }
    }
}

您可以尝试一下。希望有帮助。