2016-08-02 22 views
2

我有一個簡單的iOS應用程序,可將1,000個聯繫人與我的Firebase同步。 persistenceEnabled在我的AppDelegate中設置爲true。Firebase ChildAdded每次在我的iOS應用程序中觸發

在我的UITableViewController中,我觀察到ChildAdded事件,下載聯繫人並且工作正常。

問題是這樣的 - 我下次打開應用程序,回到UITableViewController,ChildAdded事件再次觸發並加載1,000個聯繫人。

我認爲會發生的事情是,隨後啓動ChildAdded事件不會觸發,因爲persistenceEnabled爲true,並且沒有添加新的子項。

我誤解了Firebase的工作原理嗎?

ref.child("contacts").observeEventType(.ChildAdded, withBlock: { snapshot in 

    if let json = snapshot.value as? NSDictionary { 

     for key in json.keyEnumerator() { 
      if let dict = json.valueForKey(key as! String) as? NSDictionary { 
       let contact = Contact(data: dict) 
       contacts.append(contact) 
      } 
     } 
    } 
}) 
+0

檢查此代碼是從viewWillAppear還是從viewDidAppear調用。如果是這樣,那麼每次你回到這個控制器時都會觀察它。 –

+0

嗨迪帕克,它被稱爲viewWillAppear,但這不是問題。我希望每次回到控制器時都會觀察它,但我不希望每次都返回1,000個聯繫人。我原以爲它只會第一次返回1,000個聯繫人。 –

回答

0

由於您正在註冊observeEventType而不是observeSingleEventType。所以在viewDidLoad中只註冊一次事件。你將第一次獲得該節點中的所有可用數據。下次開始它只會給你添加新的孩子。如果你想每次查詢firebase,然後註冊observeSingleEventType,但它會再次返回該節點中可用的所有數據,並將刪除observer,因爲它是observeSingleEventType。

1

Firebase documentation on .ChildAdded

的FIRDataEventTypeChildAdded事件被觸發爲每個現有的子一次,然後再每一個新的子項被添加到指定路徑的時間。

使用持久性對此行爲沒有影響。如果在沒有網絡連接的情況下啓動應用程序,它確保該事件也可以以這種方式工作。

+0

謝謝弗蘭克,我懷疑是這樣。這是將1,000個聯繫人加載到內存中嗎?在我的場景中,我希望擁有本地的聯繫人緩存,然後可以查詢,就像在典型的CoreData場景中一樣,只在後端添加新聯繫人時更新此緩存。 Firebase似乎總是從本地緩存(持久保存)或通過網絡加載這1000個聯繫人。 –

+0

Firebase API是一個在線優先的API,當您的應用程序在短時間內處於離線狀態時,它可以繼續工作。爲了使數據保持最新,請參閱https://firebase.google.com/docs/database/ios/offline-capabilities#section-prioritizing-the-local-cache –

+0

@FrankvanPuffelen如何防止這種情況。就像我想執行.childadded,當新的孩子不添加現有的節點。 –

相關問題