循环 Json 链接 Swift

Loop Json Links 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 链接 1 : { "id": 88 }

Json 链接 2 : { "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()

    }
}

您应该使用由 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)
}

保证调用顺序的唯一方法是在上一个调用的回调中进行下一个调用。这将适用于几个链接,但不能很好地概括。如果数字变化并保持相对较小,您可以制作一个有序的 "links to call" 列表并在每个回调中处理它直到它为空。