ios - 异步 completionHandler 中的返回值

标签 ios swift

我有以下方法,如果 SessionStatus 完成,我想返回 movieDestinationUrl,但是我不断收到此错误 Unexpected non-void return value in void function。我做错了什么?

func createVideo() -> NSURL {

    //  create new file to receive data
    let docsDir: AnyObject = documentsPath
    let movieFilePath = docsDir.stringByAppendingPathComponent("result.mov")
    let movieDestinationUrl = NSURL(fileURLWithPath: movieFilePath)
    _ = try? NSFileManager().removeItemAtURL(movieDestinationUrl)

    // use AVAssetExportSession to export video
    let assetExport = AVAssetExportSession(asset: composition, presetName:AVAssetExportPresetHighestQuality)
    assetExport!.outputFileType = AVFileTypeQuickTimeMovie
    assetExport!.outputURL = movieDestinationUrl
    assetExport?.videoComposition = layercomposition
    assetExport!.exportAsynchronouslyWithCompletionHandler({
        switch assetExport!.status{
        case  AVAssetExportSessionStatus.Failed:
            print("failed \(assetExport!.error)")
        case AVAssetExportSessionStatus.Cancelled:
            print("cancelled \(assetExport!.error)")
        default:
            print("Movie complete")


            // save to photoalbum
            return movieDestinationUrl

        }
    })

}

最佳答案

同步:你需要一把锤子。你派人从你的工具箱里拿起锤子,带着它回来,然后把锤子递给你。与此同时,你正在等待那个人回来。很简单,效率很低,因为你把所有的时间都花在等待别人上。

异步:你需要一把锤子。你派人从你的工具箱里拿起锤子。但你不会等待锤子回来,因为你还有其他事情要做。当这个人带着锤子回来时,他们把它放在一个标有“把锤子放在这里!”的地方。然后在你的一叠纸条上写上“锤子准备好了”的字条。一旦你完成了你正在做的事情,你就会看到纸条,将其取出,然后拿起锤子。

这就是异步调用的工作原理。他们跑到最后,他们将结果存放在您可以找到它们的地方,并且通常会通过调用您提供给他们的代码块来通知您。 (这就是“completionHandler”)。

关于ios - 异步 completionHandler 中的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33872997/

相关文章:

ios - 如何在实时帧捕获中使用 GoogleMobileVision?

ios - iOS静态库中的公共(public)头文件

iphone - UIViewController 保留计数问题

ios - 在 iOS 上每 n 秒执行一次连接检查

ios - 以编程方式将默认加密 KMS 添加到存储桶

ios - 使 UIView 可滚动和可缩放

ios - AudioKit 缓冲区消耗大量内存

swift - 如何使用 SwiftUI 将图像与列表行中的右角对齐?

ios - 无法同时满足动画约束

swift - 为什么不在 Swift 中使用可选值?