在我的项目中,我遇到了一种情况,需要使用后台队列来创建 AVPlayerItem (我在
我想要做类似以下的事情:
setupTrackModels
函数中创建)。我想在 getTracks
函数中实现它,并且这个方法必须还有一个完成处理程序,我需要在主线程中调用它,但是无论如何我都无法将它们联系起来。我收到编译器错误:Escaping closure captures non-escaping parameter 'completion'
。也许有人能告诉我如何做到这一点或者展示另一种方法。我想要做类似以下的事情:
var content: [URL] = []
var tracks: [TrackModelProtocol] = []
private func getTracks(completion: () -> ()) {
DispatchQueue.global(qos: .background).async { //Error: Escaping closure captures non-escaping parameter 'completion'
self.tracks = self.setupTrackModels(content: self.content)
DispatchQueue.main.async { //Error: Escaping closure captures non-escaping parameter 'completion'
completion()
}
}
}
然后我想这样使用该函数:
getTracks {
tableView.reloadData()
//or something else
}
我不想在DispatchQueue.main块中使用tableView.reloadData()
,因为我多次调用getTracks
并且我希望在其完成块中实现不同的逻辑。
completion
参数标记为@escaping
。 - Paulw11Void
而不是()
作为闭包的返回类型,例如func getTracks(completion: @escaping () -> Void) { ... }
。 - Rob