ios - 转义闭包捕获非转义参数“完成”(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
}
我不想tableView.reloadData()
在 DispatchQueue.main 中使用。块,因为我调用getTracks
了几次,我想在它的完成块中实现不同的逻辑
解决方案
采用@escaping
private func getTracks(completion:@escaping () -> ())
推荐阅读
- python - 如何删除csv文件中的不可打印字符?
- python - 比这个嵌套的 try-except 语句更好的方法?
- java - Spring Redis pubsub:onMessage 回调数据操作不起作用
- authentication - PayPal和支付实施
- windows - 批处理文件删除旧文件
- python - 从 DateTime Pandas 系列中提取小时数
- c# - C# WPF 线程:如何在事件函数中停止新创建的线程(单击按钮)。不影响主线程
- java - 在 weka jython 中处理数据属性
- sql-delete - SQL“DELETE FROM ...”不起作用,因为弹性池已满
- flutter - 有没有办法序列化 json 响应(来自 .net API)以将列表中的 $ref 对象替换为 dart 中的完整对象?