同步调用闭包时返回的值(PHImageManager with isSynchronous = true)



我调用的api是设计的既可异步又可同步模式。我使用PHImageManager.requestImageDataAndOrientation(docs)来请求图像文件,同时编写更具可读性(线性)的代码。

let requestImageOptions = PHImageRequestOptions()
requestImageOptions.isSynchronous = true
var photos: [Data] = []
let requestIdentifier = PHImageManager.default().requestImageDataAndOrientation(for: asset, options: requestImageOptions) { [weak &photos] (imageData, dataUTI, orientation, info) in
photos.append(imageData)
}
// do stuff with photos here because the previous call is synchronous

不幸的是错误信息没有帮助:Expected name of in closure capture list。我对&photos的尝试是使用值类型变量的引用,因为值类型不能直接引用。有人能给我指个正确的方向吗?


对于那些错误地认为他们可以在方法调用下面立即获得值的人来说,这可能是一个常见的问题,他们认为调用是同步的,但不是。在我的例子中,我将调用配置为同步. 我也知道我可以在闭包中做所有的工作,但是这样我就不能从函数中返回数据。当然,我可以尝试一个类(值类型)将数据传输出闭包。

编译器反对,因为闭包开头的[weak &photos]语法不合法。

你不需要关心捕获局部变量photos的闭包;它不能引起retain循环。

您确实需要有条件地展开imageData

同样重要的是要注意,只有在从后台队列调用requestImageDataAndOrientation时才能使用同步选项。您的代码没有显示后台队列调度。如果你在后台队列上执行调用,你需要将任何UI更新调度回主队列。

考虑到这一点,使用异步形式并在完成闭包中简单地执行所需的处理可能更简单。

let requestIdentifier = PHImageManager.default().requestImageDataAndOrientation(for: asset, options: requestImageOptions) {(imageData, dataUTI, orientation, info) in
guard let imageData = imageData else
{ return }
photos.append(imageData)
}

最新更新