首页 > 解决方案 > 转义闭包捕获非转义参数“完成”(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了几次,我想在它的完成块中实现不同的逻辑

标签: iosswiftgrand-central-dispatchcompletionhandler

解决方案


采用@escaping

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

推荐阅读