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と交通「バイク」
私も汚いコードを知って、私は苦労してきましたそれと少し。
私はあなたが正しいと信じています。私は関数の外でそれを宣言するのではなく、関数内にcommuteBuilderを宣言することによってそれを修正することができました。私は、これが配列の構築方法と関係していると推測しています。関数の外でそれを宣言すると、ただ一つのオブジェクトと配列は、異なるオブジェクトを作成するのではなく、単にそれを複数回指します。 –