Swift3 首次运行时,在自定义相册中保存照片失败

Swift3 首次运行时,在自定义相册中保存照片失败,swift3,phphotolibrary,Swift3,Phphotolibrary,您好,我正在创建一个相册应用程序作为一个学习项目,我在PHPhotoLibrary.shared()中遇到了一些问题。PerformChanges和Wait;主要问题是,当方法saveImage时,它具有PHPhotoLibrary.shared().performchange和waitcode;方法在PHPhotoLibrary.shared()完成保存图像之前退出。即使在我使用performChangesAndWait方法时,代码似乎也是异步执行的,根据文档说明,应该等到它完成 下面是我的类

您好,我正在创建一个相册应用程序作为一个学习项目,我在PHPhotoLibrary.shared()中遇到了一些问题。PerformChanges和Wait;主要问题是,当方法saveImage时,它具有
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...")
        }
    }
}