2016-09-09 17 views
0

私は自分のアプリケーションにtableViewを持っていて、アプリケーションをロードすると、(サーバーから取得した)犬のリストが表示されます。swift forループが十分な回数ループしていない

私はこれを使用していますが、サーバーからリストの最初の犬のみを読み込みます。

ここでは、サーバからのJSON応答が

do { 
      let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [AnyObject] 
      dispatch_async(dispatch_get_main_queue(), { 
       self.tableView.beginUpdates() 
      if let theDogs = json[0] as? [[String: AnyObject]] { 
       for dog in theDogs { 
        print("Dog") 
        if let ID = dog["ID"] as? String { 
         print(ID + " Safe") 
         let thisDog = Dog(name: (dog["Name"] as? String)!, surname: (dog["Surname"] as? String)!, id: (dog["ID"] as? String)!, boarding: true) 
         let newIndexPath = NSIndexPath(forRow: self.dogs.count, inSection: 0) 

          // code here 
         self.dogs.append(thisDog) 
         self.tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Bottom) 


        } 
       } 
      } 
       self.tableView.endUpdates() 
      }) 
     } catch { 
      print("error serializing JSON: \(error)") 
     } 

ここにあなたのように

Optional([[{"ID":"47","Name":"Sparky","Surname":"McAllister"}], 
[{"ID":"31","Name":"Maddie","Surname":"Crawford"}]]) 
Dog 
47 Safe 

(サーバーからの印刷された応答を含む)のログのコピーだserialisesところから始まるコードですログから見ると、このリストに2匹の犬がいます。 ループが動作していた場合はDogがログに2回、新しいDogオブジェクトを作成する部分には31 Safeが表示されます。

私は間違っていたことを解決できません、誰も私の問題を見ることができますか?

おかげ

+1

JSONの構造が奇妙です。 1つの辞書だけの配列です。本当に奇妙です。だから 'TheDogs'は[AnyObject]でなければなりません。' if aDog = dog [0]を[String:AnyObject] 'のようにループする必要があります。 – Larme

+0

私のPHPは独学でした...私はおそらくそれについての質問を投稿する必要があります最初の配列を取り除く方法を決して笑... –

+1

あなたのJSONはもっと感覚的です: '' {ID ":" 47 "、"名前 ":"スパルキー "、"姓 ":"マカリスター "}、{" ID ":" 31 " : "Maddie"、 "Surname": "Crawford"}] '犬の並び、犬は辞書です。それでは、あなたのコードを保持し、この行だけを変更する必要があります: 'if theDogs = json [0]を? theDogs = jsonをletとすれば、[[String:AnyObject]] ''に '? '[String:AnyObject]]' – Larme

答えて

1

あなたはJSONのこの部分を取得するif let theDogs = json[0]呼び出すときJSONが1つの辞書それぞれを含む配列の配列があるので:[{"ID":"47","Name":"Sparky","Surname":"McAllister"}]
あなたはJSONのこの部分を取得するためにif let theDogs = json[1]を呼び出す必要があります:

[{"ID":"31","Name":"Maddie","Surname":"Crawford"}] 
+0

を作成していたコードを見つけることができませんでした。 '犬のための' json'? –

+0

待って...私はそれを見ていると思う...私はちょうど言及したようにしてから、質問のコメントにあるように 'let aDog = dog [0]'をしましょうか? –

1

[OK]をトラヴィスの答えのおかげで、私はどこが間違っているのか分かりました。私はちょうど彼の提案に少し微調整をしたので、答えとして投稿しています。

Travisが言ったように、私もアクセスjson[1]が必要ですが、私はそのリストに7つの異なる犬を持つことができました!

ので、私には、以下の変更を加えた:

は今です: theDogs = JSONとしてましょうか? [[AnyObject]] {

これは、forループで私がルート配列にアクセスしていることを意味します。

それからからループのために変更された:私はよ、theDogs内のすべてのアレイのことを意味する[0]

theDogs { LET犬= aDogにaDogため :に

for dog in theDogs{ 

配列内の唯一のオブジェクトを取得し、それをdogと呼んでください。 問題は解決され、将来は証明されました。

お手伝いいただきありがとうございます!

+0

より良い解決策は、サーバーによるJSON出力を簡単な構造(辞書の配列)に修正することです。これによりコードがより洗練されますが、変更するためにサーバーを制御していることを前提としています。 – Travis

+0

アプリは私の両親のために、彼らは緊急に(ビジネスのために)必要でした...私はちょうどそれを働かせて、それを使用し始めた後すべてそれを修正するつもりです –

+0

十分に公正。上記の解決策の唯一の問題は、サーバーが何らかの理由で内部配列に複数の犬辞書を置いたことがあった場合、 "the dogs {let dog = aDog [0]"のaDogのために逃してしまいます。もしあなたが本当に将来証明したいのであれば、内部配列の辞書をループする必要があります。 – Travis

関連する問題