使用从Firebase获取的数据填充tableView

时间:2016-11-14 20:12:22

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

以下是我的情景:

1)数据源到我的tableView是一个名为books的数组 - var books:[BookItem]

2)我在db中的某些数据发生变化时随时填充books

3)我通过连接两个表中的数据来创建BookItem,因为BookItem包含一些特定于用户的数据和一些关于该书本身的一般数据。

我编写了一个名为createDataSource的方法,负责使用books s填充BookItem数组

func createDataSource()
{
    self.books.removeAll()

    let userId:String = UserDefaults.standard.value(forKey: "UserId") as! String

    let bookForUserRef = self.ref!.child("users").child(userId).child("userbooks")

    bookForUserRef.observe(.value, with: { snapshot in
        var i = 0

        for element in snapshot.children
        {
            i = i + 1

            let item:FIRDataSnapshot = element as! FIRDataSnapshot
            let postDict = item.value as! [String : AnyObject]
            let key = item.key

            let booksRef = self.ref!.child("books").child(key)
            booksRef.observe(.value, with: { snapshot in

                let bookItem = (snapshot as! FIRDataSnapshot).value as! [String : AnyObject]
                let id = booksRef.key
                print(id)
                let record = [bookItem["title"] as! String, bookItem["author"] as! String, "0", "\(bookItem["pagesCount"] as! Int)"]

                let item = BookItem(title: bookItem["title"] as! String, author: bookItem["author"] as! String, pagesCount: bookItem["pagesCount"] as! Int, currentPage: postDict["currentPage"] as! Int, language: bookItem["language"] as! String, year: nil, ISBN: nil, id: id, added: postDict["added"] as? String ?? "21")
                self.books.append(item)
                self.tableView.reloadData()

            })

        }

    })

}

无论何时我调用此方法,所有现有元素都会在books数组中重复。

我认为它可能与for循环有关,但在调试后似乎没问题。

我认为firebase中的观察者有一些特定内容可以复制元素。我对firebase很新,我想我的方法可能有些混乱和混乱。

应该在createDataSource()方法中修改什么来摆脱元素重复?

另外,我使用firebase和tableView的方法是否正确?

1 个答案:

答案 0 :(得分:0)

感谢@ntoonio的评论,我得到了解决

 func createDataSource()
 {

    let userId:String = UserDefaults.standard.value(forKey: "UserId") as! String

    let bookForUserRef = self.ref!.child("users").child(userId).child("userbooks")

    bookForUserRef.observe(.value, with: { snapshot in
        var i = 0
        self.books.removeAll()
        for element in snapshot.children
        {
            i = i + 1

            let item:FIRDataSnapshot = element as! FIRDataSnapshot
            let postDict = item.value as! [String : AnyObject]
            let key = item.key

            let booksRef = self.ref!.child("books").child(key)
            booksRef.observe(.value, with: { snapshot in

                let bookItem = (snapshot as! FIRDataSnapshot).value as! [String : AnyObject]
                let id = booksRef.key
                print(id)
                let record = [bookItem["title"] as! String, bookItem["author"] as! String, "0", "\(bookItem["pagesCount"] as! Int)"]

                let item = BookItem(title: bookItem["title"] as! String, author: bookItem["author"] as! String, pagesCount: bookItem["pagesCount"] as! Int, currentPage: postDict["currentPage"] as! Int, language: bookItem["language"] as! String, year: nil, ISBN: nil, id: id, added: postDict["added"] as? String ?? "21")
                self.books.append(item)
                self.tableView.reloadData()


            })

        }

    })

}