几天以来我一直试图解决此错误,但我不明白为什么我会首先收到此错误。
请帮助...
func createData(request:Crudpb_CreateRequest) -> String {
DispatchQueue.main.async {
self.response = try! self.client.create(request)
print("This is response 1: " + self.response.result) // <-------- This is priting the right response
}
print("This is response outside DispatchQueue: " + self.response.result) // <------- This is not printing anyvalue
return self.response.result // <------ This is not
}
答案 0 :(得分:1)
您正在异步调度您在create request方法中正在执行的任何工作,因此您的create data函数将不等待该工作完成以继续执行,它只是调用它并保持其执行,这就是您的价值之所在当您到达“这是DispatchQueue:之外的响应”语句时,不会被修改。 它将在您创建的捕获块中进行修改,这就是为什么您需要像前面提到的那样创建@转义完成块,以便仅在完成获取工作时返回您的值。
func createData(request:Crudpb_CreateRequest, with completion: @escaping (String) -> Void) {
DispatchQueue.main.async {
self.response = try! self.client.create(request)
completion(self.response)
}
}
答案 1 :(得分:0)
这是我使用@escaping闭包的方式:您不需要在函数中返回值,因为调用函数的执行可以在闭包完成之前结束。您还需要在@escaping参数中指定一个dataType(在这种情况下为Bool)...,函数类型不能具有参数标签,因此必须使用“ _”
self.fetchStuff(onCompletion: { (success) in
if success {
// Do something
}
})
func fetchStuff(onCompletion: @escaping (_ success: Bool) -> Void) {
// Do some asynch stuff
onCompletion(true)
}