2017-04-04 54 views
1

我想通過使用觀察者從firebase獲取數據。但是當我嘗試將值追加到我之前創建的數組中時,它失敗了。這裏是代碼,有人可以幫我嗎?swift3 append函數在firebase裏面不起作用observeSingleEvent

class ProductTableViewController: UITableViewController{ 
    var productName:[String] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     fetchProduct() 
     print(self.productName.count) 
    } 

    func fetchProduct(){ 
     let currentUserId = FIRAuth.auth()?.currentUser?.uid 

     FIRDatabase.database().reference().child("users").child(currentUserId!).child("products").observe(.value, with: { (snapshot) in 
       self.productName.append("Hello") 
     }, withCancel: nil) 
    } 

應該打印1我追加值成​​數組 之後,但它打印0

+1

在'print'行和'append'行上放置一個斷點。現在運行你的代碼並注意哪一個被首先調用。 – rmaddy

+0

這是因爲Firebase偵聽器是異步的。您應該能夠在Swift中在線找到大量示例,瞭解如何處理此問題。 –

回答

0

你要知道,火力地堡觀察者是異步的,所以即使你第一次調用它,它會必須等待迴應。在此期間,您的應用程序將繼續執行其餘的代碼,因此它將調用打印功能。如果你想證明它,請嘗試將打印內的火力點呼叫:

class ProductTableViewController: UITableViewController{ 
var productName:[String] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    fetchProduct() 

} 

func fetchProduct(){ 
    let currentUserId = FIRAuth.auth()?.currentUser?.uid 

    FIRDatabase.database().reference().child("users").child(currentUserId!).child("products").observe(.value, with: { (snapshot) in 
      self.productName.append("Hello") 
      print(self.productName.count) 
    }, withCancel: nil) 
} 

希望它有幫助!

+0

謝謝,它真的有幫助 –

+0

不客氣! –