DispatchQueue.main.async外部的变量为空

时间:2019-05-07 22:30:13

标签: swift grpc

几天以来我一直试图解决此错误,但我不明白为什么我会首先收到此错误。

请帮助...

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
}

enter image description here

2 个答案:

答案 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)
}