当我 select 来自 iCloud 的照片时应用程序崩溃
App crashed when i select a photo from iCloud
我正在尝试从我的设备中获取所有照片,并将它们显示在一个集合中:
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
}
对于某些图像,我在这些空单元格中收到此错误 "Failed to load image data for asset "。有人可以解释为什么它不获取 iCloud 图像吗?
因为下面的代码是一个闭包
manager.requestImageData(for: asset, options: options) { data, _, _, _ in
if let data = data {
img = UIImage(data: data)
}
}
并且闭包在后台线程上执行并且不是内联的。闭包执行可能需要时间,并且可能不会立即 return 数据。
您可以尝试为要加载的图像创建闭包回调。
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")
}
}
}
你可以试试这个。希望对您有所帮助。
我正在尝试从我的设备中获取所有照片,并将它们显示在一个集合中:
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
}
对于某些图像,我在这些空单元格中收到此错误 "Failed to load image data for asset "。有人可以解释为什么它不获取 iCloud 图像吗?
因为下面的代码是一个闭包
manager.requestImageData(for: asset, options: options) { data, _, _, _ in
if let data = data {
img = UIImage(data: data)
}
}
并且闭包在后台线程上执行并且不是内联的。闭包执行可能需要时间,并且可能不会立即 return 数据。
您可以尝试为要加载的图像创建闭包回调。
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")
}
}
}
你可以试试这个。希望对您有所帮助。