我无意中发现了下面的一段代码,但我无法理解它是如何工作的。
调用 AVCapturePhotoCaptureDelegate
方法时会填充以下属性:
var photoCaptureCompletionBlock: ((UIImage?, Error?) -> Void)?
委托(delegate)方法由以下代码触发:
func captureImage(completion: @escaping (UIImage?, Error?) -> Void) {
let settings = AVCapturePhotoSettings()
self.photoOutput?.capturePhoto(with: settings, delegate: self)
self.photoCaptureCompletionBlock = completion
}
触发委托(delegate)的行是:
self.photoOutput?.capturePhoto(with: settings, delegate: self)
紧接着 completion
变量被分配给 self.photoCaptureCompletionBlock
从概念上讲,我会理解相反的情况,即将 self.photoCaptureCompletionBlock
分配给 completion
而不是相反(如果没有 inout<,这是不可能的
变量,因为 completion
是一个 let
。
这项任务背后的机制是什么?它是如何工作的?
编辑:对于上下文,调用的委托(delegate)方法如下:
func photoOutput(_ output: AVCapturePhotoOutput,
didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?,
previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
resolvedSettings: AVCaptureResolvedPhotoSettings,
bracketSettings: AVCaptureBracketedStillImageSettings?,
error: Error?) {
if let error = error {
self.photoCaptureCompletionBlock?(nil, error)
} else if let buffer = photoSampleBuffer,
let data = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: buffer, previewPhotoSampleBuffer: nil) {
let image = UIImage(data: data)
self.photoCaptureCompletionBlock?(image, nil)
} else {
self.photoCaptureCompletionBlock?(nil, CameraControllerError.unknown)
}
}
最佳答案
您的方法 captureImage(completion: @escaping (UIImage?, Error?) -> Void)
不是 AVCapturePhotoCaptureDelegate
协议(protocol)的一部分。它是实现此协议(protocol)的对象 API 的自定义方法。
所以由于没有那个对象的完整代码,我只能猜测。在此方法中,您开始拍照并传递完成 block ,当拍照完成时将触发完成 block 。
这个完成 block 存储在对象的变量中,我认为还有一些其他的委托(delegate)方法,例如这个 func photoOutput(AVCapturePhotoOutput, didFinishProcessingPhoto: AVCapturePhoto, error: Error?)
在对象实现中会触发这个拍照后的完成 block 将完成。
关于ios - 在 Swift 中将完成处理程序分配给闭包变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52029651/