2017-10-18 1 views
0

私はidの値を取得したい2つのリンクを持つ配列を持っています。コードは動作しますが、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ではありません。変数名は、* snake_casedではなく* camelCased *とされています。 – vadian

+0

応答と情報をありがとう。残念ながら注文はオプションです。それを同期させる可能性はありますか? –

+0

['DispatchGroup'](https://developer.apple.com/documentation/dispatch/dispatchgroup)を使用して注文を保存する – vadian

答えて

0

オブジェクトdefiの配列Deviceを使用する必要があります定義さ:順序を保証する唯一の方法

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

ありがとうございました。プログラムでリンクを追加することは可能ですか?私は、この構造体がdeviceArray.appendとどのように動作するかを理解できません。 –

+0

もちろん、deviceArrayにDeviceを追加することができます: 'deviceArray.append(Device(link:" https:// newlink "))' –

0

:あなたがして、あなたの最初の識別子ですにアクセスすることができます

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

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")] 

次に、あなたがにあなたのループを変更します前のコールバックで次のコールを行うことです。それは2つのリンクのために働くが、よく一般化しない。数字が変化してもそれほど小さくない場合は、オーダーされた「呼び出しリンク」リストを作成し、空になるまで各コールバックでそれを処理できます。