Функция завершает выполнение до завершения обработчика завершения - PullRequest
0 голосов
/ 21 января 2019

Я хочу вернуть результат, который рассчитывается из HelperConnection.shared.getInfo (). Но я всегда получаю ноль в переменной результата (также после group.wait). Как остановить текущее выполнение функции, пока не завершится HelperConnection.shared.getInfo ()?

  func install(lists:[String]) {
    let group = DispatchGroup()
    var result : String!

    if lists.count != 0 {
        for i in lists {
            group.enter()
            HelperConnection.shared.getInfo(str: i, completion: { (str) in
                if str == "1" {
                    DispatchQueue.main.async {
                        result = str
                        group.leave()
                    }
                } else {
                    DispatchQueue.main.async {
                        result = "Hello"
                        group.leave()
                    }
                }
            })
        }
    }
    print(result)
    print(".........")
    group.wait(timeout: .now() + 5)
    print(result)
    return result
   }

1 Ответ

0 голосов
/ 26 июня 2019

Используйте notify вместо wait и добавьте обработчик завершения.Принудительная синхронизация асинхронных задач - плохая практика.

func install(lists:[String], completion: @escaping: (String)->Void) {
    let group = DispatchGroup()
    var result = ""

    if lists.isEmpty { (completion("")) }
    for i in lists {
        group.enter()
        HelperConnection.shared.getInfo(str: i, completion: { str in
            defer(group.leave())
            if str == "1" {
               result = str
            } else {
               result = "Hello"
            }
        })
    }       

    group.notify(queue: DispatchQueue.main) {
        print(".........")
        print(result)
        completion(result)
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...