我无意中发现了下面这段代码,我无法确切理解它是如何工作的。
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
从概念上讲,我会理解相反的情况,即
自光捕获完成块
到
完成
而不是相反的方式(这是不可能没有
inout
自变量
是一个
let
)。
这项任务背后的机制是什么?它是如何工作的?
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)
}
}