Loop Json Ссылки Swift

У меня есть массив с двумя ссылками, где я хочу получить значение id, Код работает но device_id_array варьируется между [88.0, 89.0] and [89.0, 88.0] и я не знаю, как это исправить. Спасибо за вашу помощь.

 override func viewDidLoad() {
    super.viewDidLoad()


    device_link_array = ["http://link1.com", "http://link2.com"]

    for link in device_link_array {
        let url = URL(string: link)


        let task = URLSession.shared.dataTask(with: url!) { data, response, error in
            if error != nil
            {
                print("Error")

            }else{

                if let content = data{
                    do{     

                        let json = try JSONSerialization.jsonObject(with: content, options: []) as! [String:Any]

                        if let device_id = json["id"]{
                            device_id_array.append(device_id as! Double)
                        }
                        print(device_id_array)

                    }catch{}
                }
            }
        }
        task.resume()
    }
}

Json Link1: {"id": 88}

Json Link2: {"id": 89}

ОБНОВИТЬ:

    device_link_array = ["http://link1.com", "http://link2.com"]

    let group = DispatchGroup()
    for links in device_link_array {
        let url = URL(string: links)

        group.enter()
        let task = URLSession.shared.dataTask(with: url!) { data, response, error in
            if error != nil
            {
                print("Error")
            }
            else{

                if let content = data{
                    do{

                        let json = try JSONSerialization.jsonObject(with: content, options: []) as! [String:Any]
                        if let device_id = json["id"]{
                            device_id_array.append(device_id as! Double)

                        }
                        print(device_id_array)

                    }catch{}
                }
            }
            group.leave()
        }

        task.resume()

    }
}

2 ответа

Решение

Вы должны использовать массив Device объект определяется:

class Device {
    var link: String
    var identifier: Double?

    init(link: String) {
        self.link = link
    }
}

let deviceArray: [Device] = [
        Device(link: "http://link1.com"),
        Device(link: "http://link2.com")]

Затем вы меняете свой цикл на:

for device in deviceArray {
     let link = device.link
     ... // URLSession stuff
                if let deviceId = json["id"]{
                        device.identifer = deviceId as! Double
                }
                print(deviceArray)
     ...

Вы сможете получить доступ к своему первому идентификатору с помощью:

if let firstIdentifier = deviceArray[0].identifier {
    print(firstIdentifier)
}

Единственный способ гарантировать порядок звонков - сделать следующий звонок в обратном вызове предыдущего. Это будет работать для пары ссылок, но не будет обобщать. Если число варьируется и остается относительно небольшим, вы можете составить упорядоченный список "ссылки на звонок" и обрабатывать его в каждом обратном вызове, пока он не станет пустым.

Другие вопросы по тегам