Переменная вне DispatchQueue.main.async пуста - PullRequest
0 голосов
/ 08 мая 2019

Я пытался исправить эту ошибку уже несколько дней, но я не понимаю, почему я вообще получаю эту ошибку.

Пожалуйста, помогите ...

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 ]

1 голос
/ 08 мая 2019

Вы отправляете любую работу, которую вы выполняете в методе создания запроса асинхронно, поэтому ваша функция создания данных не будет ждать выполнения этой работы для продолжения ее выполнения, она просто вызывает ее и сохраняет ее выполнение, и поэтому ваше значениене изменяется при достижении вашего оператора «Это ответ за пределами DispatchQueue:».Он будет изменен в созданном вами блоке захвата, поэтому вам нужно создать блок завершения @escaping, как они упоминали ранее, чтобы возвращать ваше значение только после завершения работы, которую вы проделали для его получения.

func createData(request:Crudpb_CreateRequest, with completion: @escaping (String) -> Void) {
        DispatchQueue.main.async {
            self.response = try! self.client.create(request)
            completion(self.response)
        }
    }
0 голосов
/ 08 мая 2019

Так я использую @escaping замыкания: вам не нужно возвращаемое значение в функции, учитывая, что выполнение вызывающей функции может закончиться до завершения замыкания. Вам также нужно указать dataType в параметре @escaping (в данном случае Bool) ... также, типы функций не могут иметь метки аргументов, поэтому вы должны использовать "_"

self.fetchStuff(onCompletion: { (success) in
  if success {
    // Do something
  }
})

func fetchStuff(onCompletion: @escaping (_ success: Bool) -> Void) {
   // Do some asynch stuff
   onCompletion(true)
}
...