我想从我的设备获取所有的照片,并告诉他们一个集合中:
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的图像?
因为下面的代码是闭合。
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")
}
}
}
你可以试试这个。希望这有助于。