复制对象被附加在数组swift firebase

时间:2017-07-17 03:24:48

标签: ios swift uitableview firebase firebase-realtime-database

我正在使用firebase数据填充UITableView。

我一直在使用相同的过程以相同的方式创建多个tableview(我正在复制并粘贴以前的代码并根据需要修改它),所以我确信它有效。

但是,在这种情况下,我遇到了填充单元格的tableview数组的问题。

虽然我可以看到我的firebase查询块正在提取两个不同的数据集,但是当我告诉它追加每个对象时(在本例中标题为Round()),它只追加第一个,多次因为有物体。这是我的代码:

let cellId = "cellId"
var roundArray = [Round]()
let activeCourse = UserDefaults.standard.string(forKey: "activeCourse")
let ref = Database.database().reference()
override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style:.plain, target: self, action: #selector(handleBack))
    navigationItem.title = "Choose Round to Review"

    self.clearsSelectionOnViewWillAppear = false
}

override func viewWillAppear(_ animated: Bool) {
    let round = Round()

    let UID = Auth.auth().currentUser!.uid
    ref.child("userRoundData").child(UID).queryOrdered(byChild: "RoundScore").observe( .childAdded, with: { snapshot in

        if let value = snapshot.value as? [String: AnyObject] {

            round.name = value["RoundName"] as! String?
            round.date = value["RoundDate"] as! String?
            round.score = value["RoundScore"] as! Int?
            round.putts = value["RoundPutts"] as! Int?
            round.tees = value["RoundTees"] as! String?
            round.FIR = value["roundFIR"] as! Int?
            round.GIR = value["roundGIR"] as! Int?
            round.is9or18 = value["Round9or18"] as! String?
            round.possibleFIR = value["roundPossibleFIR"] as! Int?
            round.course = value["RoundCourse"] as! String?


            if round.is9or18 == "Eighteen" {
                round.possibleGIR = 18
            } else {
                round.possibleGIR = 9
            }

            round.FIRPercentage = (Float(round.FIR!) / Float(round.possibleFIR!))
            round.GIRPercentage = (Float(round.GIR!) / Float(round.possibleGIR!))

            print(round.name!)
            print(round)
            self.roundArray.append(round)
            print(self.roundArray)

            DispatchQueue.main.async(execute: {
                self.tableView.reloadData()

            })
        }
    })

    self.ref.removeAllObservers()


}

以下是我的控制台中的打印输出。它表明round.name有两个条目,但是当我追加时,你可以看到最后附加的两个对象是相同的。

 Round played at Eagle Trace Golf Club  07-16-2017 from Gold tees
<NoteCaddieNotes.Round: 0x7f9ec8016400>
[<NoteCaddieNotes.Round: 0x7f9ec8016400>]
Round played at Riverdale Golf Course - Dunes  07-13-2017 from Gold tees
<NoteCaddieNotes.Round: 0x7f9ec8016400>
[<NoteCaddieNotes.Round: 0x7f9ec8016400>, <NoteCaddieNotes.Round: 0x7f9ec8016400>]

我的问题是......为什么?!?!?!哈哈哈,这非常令人沮丧,我不知道还能做些什么。我可以补充一点,这是我在swift中的第一个项目,总的来说是编码。所以我可能没有完全理解它是显而易见的。

1 个答案:

答案 0 :(得分:2)

是不是因为您在RoundW对象的创建只在ViewWillAppear上发生一次,而不是在将值添加到该对象时?

let round = Round()

此行应该是

后观察闭包的一部分
if let value = snapshot.value as? [String: AnyObject] 

很抱歉会添加评论,但还没有评论权。