微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHFetchRequest 返回 nil 数据与图像的可选数据混合?

如何解决PHFetchRequest 返回 nil 数据与图像的可选数据混合?

我正在学习如何使用 PHFetchRequest 从用户的照片库中获取图像,然后在自定义图像选择器的滚动视图中显示它们但我得到的返回数据大部分为零,还有一些返回作为可以解包的可选数据。

我在 iCloud 上备份了我的所有照片,这可能是我变零的原因吗?

下面是我的结构中的函数,它获取数据并将其附加到一个空数组变量中...

我做错了什么?谢谢各位!

XCode log showing nil and optional returns

   func getAllImages() {
        let request = PHAsset.fetchAssets(with: .image,options: .none)
        
        dispatchQueue.global(qos: .background).async {
            let options = PHImageRequestOptions()
            options.isSynchronous = true
            
            request.enumerateObjects { (asset,_,_ ) in
                PHCachingImageManager.default().requestimage(for: asset,targetSize: .init(),contentMode: .default,options: options) { (image,_) in
                    print(image?.pngData())

                    // I had to coalesce with an empty UIImage I made as an extension
                    let data1 = Images(image: (image ?? UIImage.emptyImage(with: CGSize(width: 10,height: 10)))!,selected: false)
                    self.data.append(data1)
                }
            }
            
            if request.count == self.data.count {
                self.getGrid()
            }
            
        }
    }

解决方法

您看到的是 nil 数据,因为图像资源在云端而不是在您的手机上。 Optional 是预期的,因为不能保证它存在于您的手机上(就像在您的情况下在云中一样)。

您可以使用 PHImageRequestOptions.isNetworkAccessAllowed 选项指示获取请求从云中获取照片(如果需要)。默认情况下为 false

一个布尔值,指定照片是否可以从 iCloud 下载请求的图像。

讨论

如果 true,并且请求的图像未存储在本地设备上,则照片会从 iCloud 下载图像。要获得下载进度通知,请使用 progressHandler 属性提供一个块,供照片在下载图像时定期调用。

如果 false默认值),并且图像不在本地设备上,则结果处理程序的信息字典中的 PHImageResultIsInCloudKey 值表示该图像不是除非您启用网络访问。

progressHandler 注释

您无需实现此功能即可允许 iCloud 照片下载。没有这个,iCloud 照片下载也可以工作。 如果您计划实现此功能以在 UI 上显示进度,您应该记住,一次下载会多次触发这些调用。所以你不能认为你的照片下载在第一次调用 progressHandler 回调时就完成了。

讨论

如果您请求的图像的数据不在本地设备上,并且您已使用 isNetworkAccessAllowed 属性启用下载,则 照片会定期调用您的块以报告进度并允许您取消下载

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。