Swift 4: Создание запроса с использованием URLSession и обновление глобальной переменной - PullRequest
0 голосов
/ 27 мая 2018

Я пишу приложение, которое получает прогнозы для шин, совершая вызов API.В моем случае есть 5 автобусных маршрутов, которые я хотел бы зациклить, чтобы изменить каждую конечную точку API и затем сделать вызов.Я делаю это в методе viewdidload с помощью следующего:

  1. В классе у меня есть глобальный словарь с ключами с идентификаторами маршрута
  2. В viewdidload я зацикливаюсьнад этим словарем и вызовите метод, который возвращает закрытие для обновления словаря:

    for routeid in prioritized_routes_with_stops.keys {
        let temp_val = prioritizedRoutesHelper (completion: {lst in
            self.prioritized_routes_with_stops[routeid] = lst
        }, routeid: routeid)//all I do here is set a value for the key routeid
        print (prioritized_routes_with_stops) //ISSUE
    
  3. Здесь, если этот вспомогательный метод, prioritizedRoutesHelper:

    func prioritizedRoutesHelper(completion: @escaping (((String, String), Int, Int)) -> (), routeid: String) {
        let formatted_url = "https://api.umd.io/v0/bus/routes/\(routeid)/arrivals/\(user_dict[routeid]!.0)"
        guard let url = URL(string: formatted_url) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}
            let dataAsString = String(data: data, encoding: .utf8)
            if (dataAsString?.contains("dirTitleBecauseNoPredictions"))!  == true{
                var temp = (("a", ""), 0, 0)//placeholder to see if update to "a"
                completion(temp)//ignore else case...
    

Итак, мой вопрос заключается в следующем: почему после цикла for на шаге 2, когда я печатаю свой обновленный словарь, никакие значения не были обновлены.Если, например, я печатаю значения в словаре в замыкании, он печатает правильное значение, но когда я печатаю глобальную переменную после циклического прохождения всех маршрутов, она не обновляется?Спасибо!

1 Ответ

0 голосов
/ 17 июля 2018

Вы делаете ГРУППУ асинхронных запросов, я предлагаю вам использовать DispatchGroup, поэтому до for routeid in prioritized_routes_with_stops.keys { добавьте:

let group = DispatchGroup()

, затем после этого для добавления:

group.enter()

затем в вашем закрытии завершения, перед self.prioritized_routes_with_stops[routeid] = lst добавьте:

group.leave()

наконец, после этого для:

group.notify(queue: .main) {
    print (prioritized_routes_with_stops)
}
...