2017-10-08 67 views
0

我正在製作一個應用程序,用戶可以在其中購買和出售門票。用戶可以創建新的故障單併成功上傳到Firebase,但是對故障單ID的引用存儲在引用故障單數據中的故障單ID的用戶數據中。數據庫的結構在下面:從Firebase解析數據時無法成功重新加載UITableView元素

DATABASE

  • USERS
  • 訂票

訂票

  • TICKET INFO

USER

  • 票用戶信息和訂票編號是賣

我的問題是我第一次從賣票它的優良加載門票。但是,當用戶添加他們銷售的新票時,表視圖會加載所有內容兩次。

override func viewWillAppear(_ animated: Bool) { 
    self.tickets = [] 
    DataService.ds.REF_USER_CURRENT.child("selling").observe(.value, with: { (snapshot) in //HERE WE REFERNCE OUR SINGELTON CLASS AND OBSERVE CHAMGE TO THE POSTS OBJECT 
     self.tickets = [] //WE CLEAR THE POSTS ARRAY BEFORE WE START MANIPULATION TO MAKE SURE THAT WE DONT REPEAT CELLS 
     if let snapshot = snapshot.children.allObjects as? [DataSnapshot]{ 
      print("ADAM: \(snapshot)")//CHECKING THAT THE OBJECTS EXIST AS AN ARRAY OF DATA SNAPSHOTS 
      for snap in snapshot { 
       DataService.ds.REF_TICKETS.child(snap.key).observe(.value, with: { (snapshot) in 

        if let ticketDict = snapshot.value as? Dictionary<String, AnyObject>{ 

         let ticket = Ticket(ticketID: snap.key, ticketData: ticketDict) 

         self.self.tickets.append(ticket) 
        } 

        self.sell_ticketsTableView.reloadData() 
       }) 
      } 

     } 
     //self.sell_ticketsTableView.reloadData() 
     self.tickets = []//RELAOD THE DATA 
    }) 
} 

我不太確定我出錯的地方。

+0

我真的不明白你在做什麼。這是什麼代碼「self.self.tickets.append(ticket) 」或這個「self.tickets = []」??你應該做的是在解析數據之前清空你的數據源數組,這樣你就不會有多次出現相同的票據 – Siyavash

+0

@Siyavash self.tickets = []我是如何清除數據源數組的,因爲數據源是門票數組 – KONADO

+0

請看我的回答 – Siyavash

回答

0

請將您的代碼改爲此。我已經加入,你清除陣列

override func viewWillAppear(_ animated: Bool) { 
     self.removeAll() // This is how you clear your array 
     DataService.ds.REF_USER_CURRENT.child("selling").observe(.value, with: { (snapshot) in //HERE WE REFERNCE OUR SINGELTON CLASS AND OBSERVE CHAMGE TO THE POSTS OBJECT 
      self.tickets = [] //WE CLEAR THE POSTS ARRAY BEFORE WE START MANIPULATION TO MAKE SURE THAT WE DONT REPEAT CELLS 
      if let snapshot = snapshot.children.allObjects as? [DataSnapshot]{ 
       print("ADAM: \(snapshot)")//CHECKING THAT THE OBJECTS EXIST AS AN ARRAY OF DATA SNAPSHOTS 
       for snap in snapshot { 
        DataService.ds.REF_TICKETS.child(snap.key).observe(.value, with: { (snapshot) in 

         if let ticketDict = snapshot.value as? Dictionary<String, AnyObject>{ 

          let ticket = Ticket(ticketID: snap.key, ticketData: ticketDict) 

          self.tickets.append(ticket) 
         } 

         self.sell_ticketsTableView.reloadData() 
        }) 
       } 

      } 
      //self.sell_ticketsTableView.reloadData() 
     }) 
    } 
0

你正在觀察一個什麼樣的用戶銷售,這意味着每次添加的東西到這個列表的時間價值的一部分,你的聽衆會觸發,給你新的價值全部爲users/$uid/selling

這就是爲什麼當用戶添加另一張票時你會看到雙倍的原因;監聽器被觸發,並且您將每張票都重新附加到數組上。您可以通過檢查票證是否已添加到數組中之前解決此問題,但是您可以改進您的當前實施。您應該使用.childAdded而不是使用observe(.value。每次添加新的孩子時,監聽器都會觸發,並且只會爲您提供特定的子快照。

監聽器最初會觸發該引用中的每個孩子,並且可以將它們單獨附加到該數組。但是,一旦所有孩子都被加載完畢,下一個要添加的孩子將觸發這個監聽器,您可以將其添加到數組中。

+0

,所以當我拍快照時說,第二次,它只會返回新添加的孩子? – KONADO

+0

使用'.childAdded'將一次只返回一個孩子,而不是全部。這樣做更好,因爲如果用戶決定添加另一張票據,則不需要您在表格中已經存在的所有其他票據。它也會在兒童初次加載後,另一個加入時觸發。 – Callam