Swift3 首次运行时,在自定义相册中保存照片失败
您好,我正在创建一个相册应用程序作为一个学习项目,我在PHPhotoLibrary.shared()中遇到了一些问题。PerformChanges和Wait;主要问题是,当方法saveImage时,它具有Swift3 首次运行时,在自定义相册中保存照片失败,swift3,phphotolibrary,Swift3,Phphotolibrary,您好,我正在创建一个相册应用程序作为一个学习项目,我在PHPhotoLibrary.shared()中遇到了一些问题。PerformChanges和Wait;主要问题是,当方法saveImage时,它具有PHPhotoLibrary.shared().performchange和waitcode;方法在PHPhotoLibrary.shared()完成保存图像之前退出。即使在我使用performChangesAndWait方法时,代码似乎也是异步执行的,根据文档说明,应该等到它完成 下面是我的类
PHPhotoLibrary.shared().performchange和wait
code;方法在PHPhotoLibrary.shared()完成保存图像之前退出。即使在我使用performChangesAndWait
方法时,代码似乎也是异步执行的,根据文档说明,应该等到它完成
下面是我的类中saveImage方法的代码:
func saveImage(_ image: UIImage) ->Bool {
print("Executing saveImage")
var result:Bool = false
if assetCollection == nil {
print("the album is nil")
return result
}
print("saveImage: we will start saving the image")
//TODO: the return false is happening before the photo is save.
do
{
try PHPhotoLibrary.shared().performChangesAndWait({
let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
let assetPlaceHolder = assetChangeRequest.placeholderForCreatedAsset
let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection)
let enumeration: NSArray = [assetPlaceHolder!]
albumChangeRequest!.addAssets(enumeration)
print("saveImage: image was save without issues")
result = true
print("saveImage: result value after saving the image: \(result)")
})
}
catch let error
{
result = false
print("saveImage: there was a problem: \(error.localizedDescription)")
}
print("saveImage: result value before exiting the method: \(result)")
return result
}
基本上,当应用程序第一次运行时,返回结果在保存图像块完成之前执行
有没有办法强制saveImage方法实际等待,直到performchanges和wait方法实际完成?
提前感谢您的帮助。PerformChanges和Wait
是一种异步回调方法。在performchange和wait
内部result
上所做的更改不会在返回时反映出来,因为这两个线程位于不同的线程中
等待saveImage
方法完成的一种方法是实现回调。比如:
func saveImage(_ image: UIImage, callback: @escaping(_ result: Bool)->Void) {
print("Executing saveImage")
if assetCollection == nil {
print("the album is nil")
callback(false)
}
print("saveImage: we will start saving the image")
//TODO: the return false is happening before the photo is save.
do {
try PHPhotoLibrary.shared().performChangesAndWait({
let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
let assetPlaceHolder = assetChangeRequest.placeholderForCreatedAsset
let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection)
let enumeration: NSArray = [assetPlaceHolder!]
albumChangeRequest!.addAssets(enumeration)
print("saveImage: image was save without issues")
callback(true)
})
}
catch let error {
print("saveImage: there was a problem: \(error.localizedDescription)")
callback(false)
}
}
让我们知道您得到了什么。以下是解决方案(Swift 5):
我知道此解决方案在“结果”Bool中为您提供了良好的结果反馈,但如何防止第一个saveImage失败?@drewster,问题不在于save image功能,而是刷新问题。
@objc private func handleSavePhoto() {
guard let previewImage = self.photoImageView.image else { return }
PHPhotoLibrary.requestAuthorization { (status) in
if status == .authorized {
do {
try PHPhotoLibrary.shared().performChangesAndWait {
PHAssetChangeRequest.creationRequestForAsset(from: previewImage)
}
} catch let error {
print("failed to save photo in library: ", error)
}
} else {
print("Something went wrong with permission...")
}
}
}