2017-10-18 96 views
0

我有一个数组有两个链接,我想要得到的价值id。代码有效,但device_id_array[88.0, 89.0] and [89.0, 88.0]而异,我不知道如何解决此问题。 感谢您的帮助。循环Json链接Swift

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 }

UPDATE:

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() 

    } 
} 
+0

'dataTask'异步工作,因此顺序不能保证。如果您需要订单,请对数组进行排序。顺便说一下:'GET'是默认请求。你不需要明确的请求。只需传递URL:'dataTask(with:url)...'而且你知道JSON是一个字典,为什么要将它转换为未指定的'AnyObject'?帮助编译器并将其转换为'[String:Any]'。这不是JavaScript或PHP。变量名称应该是* camelCased *而不是* snake_cased * – vadian

+0

感谢您的回复和信息。不幸的是订购是一种选择。是否有可能同步进行? –

+0

您可以使用['DispatchGroup'](https://developer.apple.com/documentation/dispatch/dispatchgroup)保持订单 – vadian

回答

0

您应该使用一个Device对象defi的数组NED通过:

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) 
    ... 

您将能够访问你的第一个IDENTIFER有:

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

非常感谢。是否有可能以编程方式添加链接?我无法弄清楚这个构造如何工作,即deviceArray.append。 –

+0

当然你可以添加设备到deviceArray: 'deviceArray.append(Device(link:“https:// newlink”))'' –

0

,以保证订单的唯一途径的呼叫是在前一个呼叫的回拨中进行下一个呼叫。这将适用于几个链接,但不能很好地概括。如果号码变化并且保持相对较小,则可以制作一个有序的“链接到呼叫”列表,并在每个回叫中对其进行处理,直到它为空。