2017-06-24 7 views
0

さてリーディングFirebaseからJSON、すべて同じ値の配列で終わる【スイフト】

"Trips" : { 
     "-KnH34F_WZYNHMsTzj0X" : { 
      "Distance" : 500, 
      "Transport" : "Walk", 
      "TripName" : "Work" 
     }, 
     "-KnH3_WnQaD3piXI7oFf" : { 
      "Distance" : 900, 
      "Transport" : "Bike", 
      "TripName" : "Test" 
     }, 
     "-KnH7yi4bl2oM6LobPQv" : { 
      "Distance" : 50, 
      "Transport" : "Bike", 
      "TripName" : "Test" 
     }, 

次に、以下のコードを使ってデータを調べ、それをTripオブジェクトの配列に追加します。

Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in 

      let dict = snapshot.value as? NSDictionary 

      if dict?["Distance"] != nil { 
       self.commuteBuilder.distance = dict?["Distance"] as? Double 
      } 
      if dict?["TripName"] != nil { 
       self.commuteBuilder.title = dict?["TripName"] as? String 
      } 
      if dict?["Transport"] != nil { 
       self.commuteBuilder.transportType = (dict?["Transport"] as? String) 
      } 

     // if self.commuteBuilder.isFilled(){ 

       self.commuteArray.append(self.commuteBuilder) 
       print("Append") 


       self.commuteTableView.reloadData() 
    //  } 


     }) 

私はブレークポイントを設定すると、新しいcommuteBuilderオブジェクトが正しくデータを埋めますが、一度付加し、commuteArrayのすべての値は、最後のオブジェクトが追加と同じデータを持ってしまいます。

したがって、上記の例では、配列は、3つのエントリで終わるだろうが、彼らはすべてのTripNameを持っているでしょう:テストとの距離:50と交通「バイク」

私も汚いコードを知って、私は苦労してきましたそれと少し。

答えて

1
self.commuteArray.append(self.commuteBuilder) 

これは間違っていると思います。一時的なcommuteBuilderオブジェクトを作成します。取得したデータをそのtempオブジェクトに入れます。そのtempオブジェクトを配列に追加します。

+0

私はあなたが正しいと信じています。私は関数の外でそれを宣言するのではなく、関数内にcommuteBuilderを宣言することによってそれを修正することができました。私は、これが配列の構築方法と関係していると推測しています。関数の外でそれを宣言すると、ただ一つのオブジェクトと配列は、異なるオブジェクトを作成するのではなく、単にそれを複数回指します。 –

関連する問題