2016-10-21 78 views
0

我有一個帖子類,用於使用來自Firebase的發佈數據填充集合視圖。
我在收到一些用戶數據時遇到了麻煩,所以我試圖將觀察者放在帖子類中。
這似乎工作正常,但從Firebase獲取數據有點延遲,因此似乎在完成Firebase調用之前完成init()函數。

這是後級:如何從Firebase調用自定義類功能中的數據

class Post { 

    var _comment1Text: String? 
    var _comment1User: String? 
    var _comment1Name: String? 

    init(comment1Text: String, comment1User: String, comment1Name: String) { 

     self._comment1Text = comment1Text 
     self._comment1User = comment1User 
     self._comment1Name = comment1Name 

     if self._comment1User != "" { 
      DataService.ds.REF_USERS.child(self._comment1User!).observeSingleEventOfType(.Value, withBlock: { userDictionary in 
       let userDict = userDictionary.value as! NSDictionary 
       self._comment1Name = userDict.objectForKey("username") as? String 
      }) 
     } 
     print(self._comment1Text) 
     print(self._comment1Name) 
    } 
} 

如果我的火力調用中打印,它的工作原理。
但是,如果我之後打印,出於某種原因,comment1name尚未填充。

有沒有辦法讓self._comment1Name包含來自Firebase的數據以及時填充collectionView?

在此先感謝。

+0

@Dravidian答案是一點。可能還有另一個問題。你的Post類是單身人士嗎?如果不是,您可能需要重新考慮您的整體策略。正如答案所示,Firebase是異步的,因此Firebase需要時間從互聯網檢索數據,並且在發生這種情況時總會有滯後。因此,在Firebase有時間檢索數據之前,您需要確保不使用數據。 Firebase數據僅在塊(封閉)內有效,因此,只有在數據返回後才能處理該數據。用一組對象做這件事會變得棘手。 – Jay

+0

是的,當我讀到它是異步的,我知道該怎麼做。必須改變策略。 –

回答

2
DataService.ds.REF_USERS.child(self._comment1User!).observeSingleEventOfType(.Value 

異步調用,所以訪問completionBlock內部打印功能,你必須更新completionBlock裏面你的CollectionView。

DataService.ds.REF_USERS.child(self._comment1User!).observeSingleEventOfType(.Value, withBlock: { userDictionary in 
      let userDict = userDictionary.value as! NSDictionary 
      self._comment1Name = userDict.objectForKey("username") as? String 

       print(self._comment1Text) 
       print(self._comment1Name) 
       // Update your collectionView  
     }) 

異步調用的被裝載在不同的網線,所以需要一定的時間來從服務器檢索數據庫。

如果你正在尋找一個自定義類之間的溝通和你的viewController看我這樣的回答: - https://stackoverflow.com/a/40160637/6297658

相關問題