ios - 转义闭包捕获非转义参数 'completion' (Swift 5)

标签 ios swift grand-central-dispatch completionhandler

在我的项目中,我遇到了需要使用后台队列来创建 AVPlayerItem(我在 setupTrackModels 函数中创建)的情况。我想在 getTracks 函数中执行此操作,并且此方法还必须有一个完成处理程序,我需要在主线程中调用它,但我不能以任何方式让他们成为 friend 。我得到编译器错误:转义闭包捕获非转义参数'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()。 block ,因为我多次调用 getTracks 并且我想在它的完成 block 中实现不同的逻辑

最佳答案

使用 @escaping

private func getTracks(completion:@escaping () -> ())

关于ios - 转义闭包捕获非转义参数 'completion' (Swift 5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64481872/

相关文章:

ios - 带有 NSAttributedString 和自定义属性的 UITextView 不起作用

php - 上传到 PHP 服务器后无法播放录制的 iPhone X 视频

ios - 如何避免嵌套 block

ios - 中止所有dispatch_semaphore_wait

ios - UIButton 对 Swift 中的第一次按下没有反应

ios - dispatch_after 与 performSelector afterDelay

ios - 如何将第 3 方 iOS SDK 集成到 Forge/Trigger 应用程序中?

ios - 如何在 Swift 中使用#selector 操作传递参数?

ios - 增加 SwiftUI 中选项卡栏项目图标的大小

ios - 如何确定 DatePicker 是否正在旋转?