swift3 - 第一次运行时在自定义相册中保存照片失败

标签 swift3 phphotolibrary

您好,我正在创建一个相册应用程序作为一个学习项目,我在使用 PHPhotoLibrary.shared().performChangesAndWait 时遇到了一些问题;主要问题是,当方法 saveImage 具有 PHPhotoLibrary.shared().performChangesAndWait 代码时;该方法在 PHPhotoLibrary.shared().performChangesAndWait 完成保存图像之前退出。似乎代码会异步执行,即使我正在使用 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

}

基本上,当应用程序第一次运行时,返回结果在保存图像 block 完成之前得到执行。

有什么方法可以强制 saveImage 方法实际等待 performChangesAndWait 方法实际完成?

预先感谢您的帮助。

最佳答案

performChangesAndWait 是一个异步回调方法。在 performChangesAndWait 中对 result 所做的更改不会反射(reflect)在 return 上,因为这两个在不同的线程中。

等待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)
    }
}

让我们知道您得到了什么。

关于swift3 - 第一次运行时在自定义相册中保存照片失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42312273/

相关文章:

string - 替换swift 3字符串中的字符

ios - 如何在 swift iOS 中创建一个通用的弹出 View Controller

ios - 处理 IOS 设置更改的正确方法

ios - Swift 3。如果我将在我的项目(google sdk)中使用谷歌地图,用户是否需要在使用之前安装谷歌地图?

swift - 快速打印没有换行符

objective-c - 在 Objective c .m 文件中声明一个 char 数据类型的字符串,并在 Swift 中使用它

swift - 无法处理 NSPhotoLibraryAddUsageDescription 的权限

url - 如何获取刚刚添加到 PHPhotoLibrary 中的图像的 URL

ios - 从 PHAsset 获取尺寸(高度和宽度)