代码之家  ›  专栏  ›  技术社区  ›  TheoK

Swift中完成处理程序对闭包变量的赋值

  •  0
  • TheoK  · 技术社区  · 6 年前

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

    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)
    
        }
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Peter Tretyakov    6 年前

    你的方法 captureImage(completion: @escaping (UIImage?, Error?) -> Void) 不属于 AVCapturePhotoCaptureDelegate

    因此,由于没有该对象的完整代码,我只能猜测。在这种方法中,您开始拍摄照片并通过完成块,当照片拍摄完成时将触发完成块。

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