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

Posted

技术标签:

【中文标题】当我从 iCloud 中选择照片时,应用程序崩溃了【英文标题】:App crashed when i select a photo from iCloud 【发布时间】:2019-02-04 16:53:04 【问题描述】:

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

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】:

因为下面的代码是一个闭包。

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

你可以试试这个。希望对您有所帮助。

【讨论】:

只需要添加 options.isNetworkAccessAllowed = true 就可以了

以上是关于当我从 iCloud 中选择照片时,应用程序崩溃了的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用照片框架从照片中选择图像时在选择器中隐藏 iCloud 图像

从照片库中选择时,应用程序崩溃 iPhone Sim

从 icloud 打开文件时,Swift 4 应用程序崩溃

当我尝试将照片上传到 Firebase 存储时,Android 应用程序崩溃

在 imageview 中显示图像时代码崩溃

如何在不重新保存的情况下从 iCloud 下载图像?