swift - 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 中操作它。
解决方案
您可以添加一个完成块作为该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)
}
推荐阅读
- javascript - 在javascript中获取唯一的键和值
- sql - 如何获取 SQL 中列的平均日期间隔?
- android - 谷歌登录时 onActivityResult() 不会调用创建新帐户
- php - PHP - 如果特定元素匹配,则合并多维数组中的内部数组
- jquery - word-break:break-word;word-break:break-all 的问题
- asp.net-core-2.0 - 如何在 Program.cs 的 asp.net core 2 中获取 webrootpath
- c# - Selenium Firefox 首选项已更改但未应用
- jquery - 根据响应数据的某些条件隐藏jQuery Datatable中的特定列
- python-3.x - 文件大小太大
- python - Pickle (Python 3.6) 写入空文件