2017-10-18 93 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

,以保證訂單的唯一途徑的呼叫是在前一個呼叫的回撥中進行下一個呼叫。這將適用於幾個鏈接,但不能很好地概括。如果號碼變化並且保持相對較小,則可以製作一個有序的「鏈接到呼叫」列表,並在每個回叫中對其進行處理,直到它爲空。