Циклические ссылки 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()

    }
}

person John_Doe    schedule 18.10.2017    source источник
comment
dataTask работает асинхронно, поэтому порядок не гарантируется. Если вам нужен порядок, отсортируйте массив. Кстати: GET — это запрос по умолчанию. Вам не нужен явный запрос. Просто передайте URL-адрес: dataTask(with: url) ... И, как вы знаете, JSON — это словарь, зачем приводить его к неуказанному AnyObject? Помогите компилятору и приведите его к [String:Any]. И это не javascript или PHP. Имена переменных должны быть camelCased, а не snake_cased   -  person vadian    schedule 18.10.2017
comment
Спасибо за ответ и информацию. К сожалению, заказ возможен. Есть ли возможность сделать это синхронно?   -  person John_Doe    schedule 18.10.2017
comment
Вы можете использовать DispatchGroup, чтобы сохранить заказ.   -  person vadian    schedule 18.10.2017
comment
Я обновил свой вопрос, пытаясь реализовать DispatchGroup. Но никакого успеха. У вас есть еще одна подсказка?   -  person John_Doe    schedule 18.10.2017


Ответы (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)
}
person Y.Bonafons    schedule 18.10.2017
comment
Большое спасибо. Можно ли добавлять ссылки программно? Я не могу понять, как эта конструкция работает, например, с deviceArray.append. - person John_Doe; 18.10.2017
comment
Конечно, вы можете добавить Device в deviceArray: deviceArray.append(Device(link: "https://newlink")) - person Y.Bonafons; 18.10.2017

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

person Ronald Poell    schedule 18.10.2017