2016-11-14 61 views
0

这里得到的数据是我的情景:填充的tableView从火力地堡

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

2)我填充books随时以dB为单位的一些数据已经改变

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

我写了一个名为createDataSource方法,该方法填充books阵列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阵列复制的照顾。

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

我想在firebase中有一些特定的观察者可以重复这些元素。我对firebase相当陌生,我想我的方法可能有点混乱和混乱。

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

此外,我的方法来使用firebase和tableView正确吗?

+1

你应该看看你的循环和观察员,它看起来有点怪。你有没有试图把'self.books.removeAll()'放在第一个值观察者的开头?如果这样的话你应该把'self.tableView.reloadData()'移到第一个观察者的末尾。 – ntoonio

回答

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() 


      }) 

     } 

    }) 

} 
+0

虽然这可行,但将书籍集合视为单个键/值对(即对象)是不鼓励的。应该使用[使用列表](https://firebase.google.com/docs/database/ios/lists-of-data)。 – Kato

+0

@Kato您能否提供处理列表的正确方法? – DCDC