Swift:如何将从委托接收到的值传递给函数的完成块?

Posted

技术标签:

【中文标题】Swift:如何将从委托接收到的值传递给函数的完成块?【英文标题】:Swift: how to pass a value received from delegate to a function's completion block? 【发布时间】:2020-06-27 15:42:05 【问题描述】:

我正在尝试在 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 中操作它。

【问题讨论】:

【参考方案1】:

您可以将完成块作为参数添加到captureImage 方法。将其分配给CameraEngine 引擎类的completion 参数。当收到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)

【讨论】:

以上是关于Swift:如何将从委托接收到的值传递给函数的完成块?的主要内容,如果未能解决你的问题,请参考以下文章

如何将从数据库接收到的数据作为道具传递给 Reactjs 中的另一个组件

如何将从服务接收到的 json 数据传递到 Angular 4 的角材料组件中的数组

为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?

将 IndexPath 行值传递给委托函数而不是 Sender.tag 以删除图像项 CollectionView Swift

如何在 Swift Flutter 插件中接收应用程序委托调用?

为啥我在实现委托以将值从子 swift 类传递给父目标 C 类时出错?