我正在尝试进行网络调用,然后更新主线程,但似乎在后台线程中创建的任何变量都不能作为参数发送到主线程:
let task = session.dataTask(with: request as URLRequest,
completionHandler: {
(data, response, error) in
guard let _:Data=data, let _:URLResponse = response, error == nil else {
return
}
let json = try? JSONSerialization.jsonObject(with: data!, options: [])
var car = "hello"
DispatchQueue.main.async (execute: self.someFunc(car)) <-- wont accept car parameter
})
task.resume()
这是签名:
func someFunc( str:String) {
}
收到以下错误:无法使用类型'(execute:())'的参数列表调用'async'
语法
DispatchQueue.main.async(execute: () -> Void)
期望没有参数的闭包。
使用语法
DispatchQueue.main.async(execute: { someFunc(str: car) })
或者使用尾随闭包语法
DispatchQueue.main.async {
self.someFunc(str: car)
}
并且不要忘记label参数。
您可以在名称前使用_
从函数中删除标签。一个例子:
func doSomething ( _ str : String ) {}
这允许你像这个
doSomething("text")
一样调用这个函数
如果你不使用下划线,你必须在调用函数时说doSomething(str : "")