我偶然发现了以下代码,我不知道它是如何工作的。
调用AVCapturePhotoCaptureDelegate
方法时将填充以下属性:
var photoCaptureCompletionBlock: ((UIImage?, Error?) -> Void)?
委托方法由以下代码触发:
func captureImage(completion: @escaping (UIImage?, Error?) -> Void) {
let settings = AVCapturePhotoSettings()
self.photoOutput?.capturePhoto(with: settings, delegate: self)
self.photoCaptureCompletionBlock = completion
}
触发委托的行是:
self.photoOutput?.capturePhoto(with: settings, delegate: self)
,然后立即将completion
变量分配给self.photoCaptureCompletionBlock
从概念上讲,我会理解相反的意思,即将self.photoCaptureCompletionBlock
分配给completion
而不是相反的方式(由于没有inout
变量,所以不可能,因为completion
是let
)。
此任务背后的机制是什么?如何运作?
EDIT :对于上下文,调用的委托方法如下:
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)
}
}
答案 0 :(得分:2)
您的方法-Wl
不属于captureImage(completion: @escaping (UIImage?, Error?) -> Void)
协议的一部分。这是实现此协议的对象API的自定义方法。
因此,由于没有该对象的完整代码,我只能猜测。在这种方法中,您将开始拍照并传递完成框,该框将在拍照结束时触发。
此完成块存储在对象的变量中,我认为还有其他委托方法,例如,对象实现中的这个AVCapturePhotoCaptureDelegate
将在完成照片捕获后触发此完成块。