首页 > 解决方案 > Swift:如何将从委托接收到的值传递给函数的完成块?

问题描述

我正在尝试在 Swift 4.2 中使用 AVFoundation 捕获图像捕获函数位于 CameraEngine 类中,该类基本上用于设置相机。因此,在我的 VC 中,我只需执行 cameraEngine.setup() 即可,一切都已为我们完成。这是捕获功能:

class CameraEngine: NSObject {

private var capturedImageData: Data?
...

    func captureImage() {
        let settings = AVCapturePhotoSettings()
        photoOutput?.capturePhoto(with: settings, delegate: self)
        print(capturedImageData)
    }

...

}
extension CameraEngine: AVCapturePhotoCaptureDelegate {
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        self.capturedImageData = photo.fileDataRepresentation()
    }
}

问题是,如何将委托接收到的值传递给函数并通过完成处理程序返回给 VC?

并像这样打电话给我的VC cameraEngine.captureImage()

我希望取回数据,以便我可以从我的 VC 中操作它。

标签: swiftclosuresavfoundationcompletionhandler

解决方案


您可以添加一个完成块作为该captureImage方法的参数。将其分配给引擎类的completion参数。CameraEngine收到photoOutput后,您可以使用此完成块。就是这样:

class CameraEngine: NSObject {

    private var capturedImageData: Data?
    //...
    var completion: ((Data?) -> Void)?
    func captureImage(completion: @escaping (Data?) -> Void) {
        self.completion = completion
        //...
    }
    //...
}
extension CameraEngine: AVCapturePhotoCaptureDelegate {
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        completion?(photo.fileDataRepresentation())
    }
}

用法:

let cameraEngine = CameraEngine()
cameraEngine.captureImage { data in
    print(data)
}

推荐阅读