在Swift中将完成处理程序分配给闭包变量

时间:2018-08-26 19:35:58

标签: ios swift

我偶然发现了以下代码,我不知道它是如何工作的。

调用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变量,所以不可能,因为completionlet)。

此任务背后的机制是什么?如何运作?

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)

    }

}

1 个答案:

答案 0 :(得分:2)

您的方法-Wl不属于captureImage(completion: @escaping (UIImage?, Error?) -> Void)协议的一部分。这是实现此协议的对象API的自定义方法。

因此,由于没有该对象的完整代码,我只能猜测。在这种方法中,您将开始拍照并传递完成框,该框将在拍照结束时触发。

此完成块存储在对象的变量中,我认为还有其他委托方法,例如,对象实现中的这个AVCapturePhotoCaptureDelegate将在完成照片捕获后触发此完成块。