转义闭包捕获非转义参数'completion' (Swift 5)
Escaping closure captures non-escaping parameter 'completion' (Swift 5)
在我的项目中,遇到需要使用后台队列创建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
并且我想在它的完成块中实现不同的逻辑
使用@escaping
private func getTracks(completion:@escaping () -> ())
在我的项目中,遇到需要使用后台队列创建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
并且我想在它的完成块中实现不同的逻辑
使用@escaping
private func getTracks(completion:@escaping () -> ())