我有以下方法,如果 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/