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

标签 ios swift

我无意中发现了下面的一段代码,但我无法理解它是如何工作的。

调用 AVCapturePhotoCaptureDelegate 方法时会填充以下属性:

var photoCaptureCompletionBlock: ((UIImage?, Error?) -> Void)?

委托(delegate)方法由以下代码触发:

func captureImage(completion: @escaping (UIImage?, Error?) -> Void) {

    let settings = AVCapturePhotoSettings()
    self.photoOutput?.capturePhoto(with: settings, delegate: self)
    self.photoCaptureCompletionBlock = completion
}

触发委托(delegate)的行是:

self.photoOutput?.capturePhoto(with: settings, delegate: self)

紧接着 completion 变量被分配给 self.photoCaptureCompletionBlock

从概念上讲,我会理解相反的情况,即将 self.photoCaptureCompletionBlock 分配给 completion 而不是相反(如果没有 inout<,这是不可能的 变量,因为 completion 是一个 let

这项任务背后的机制是什么?它是如何工作的?

编辑:对于上下文,调用的委托(delegate)方法如下:

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)

    }

}

最佳答案

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

所以由于没有那个对象的完整代码,我只能猜测。在此方法中,您开始拍照并传递完成 block ,当拍照完成时将触发完成 block 。

这个完成 block 存储在对象的变量中,我认为还有一些其他的委托(delegate)方法,例如这个 func photoOutput(AVCapturePhotoOutput, didFinishProcessingPhoto: AVCapturePhoto, error: Error?) 在对象实现中会触发这个拍照后的完成 block 将完成。

关于ios - 在 Swift 中将完成处理程序分配给闭包变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52029651/

相关文章:

ios - 我不能在两个不同的文件中使用#import "Header.h"

ios - 在 UICollectionView 中设置排序属性的问题

ios - 为什么我的金额数组没有返回任何内容?

ios - 如何从 Flutter 平台启动 ViewController 特定于 Swift 编写的代码?

ios - UITableViewCell 中的 UIScrollView 不滚动

ios - Flutter ios 构建失败 Pods-Runner-frameworks.sh

ios - 更新 RealmSwift 中的对象?

swift - 多个按钮可实现一个操作,无需 IB

ios - 基于按钮按下 Swift 在 sameTableViewController 中加载数据

ios - 具有自定义运算符的 Swift 类流式 API 设计