了解Firebase观察功能-第2部分

我想出了一个很好的解决方案来解决我一直在解决的Firebase / TableView问题。 我决定采用涉及.observeSingleEvent Firebase函数的解决方案。 作为读者,这可能并不完全有意义,因为它涉及到某些特定于我正在构建的应用程序的东西,但希望您能从中受益。

我决定不创建将观察到一系列挑战的Firebase函数,因为它仍然会产生相同的问题:我填充挑战数组的循环将存在于Firebase观察者的闭包之外。 因此,我复制了FirebaseManager.fetchChallenges函数,但有一个小区别:

 静态函数fetchChallengeOnce(withChallengeID ChallengeID:字符串,完成:@转义(Challenge)-> Void) 
dataRef.child(“ challenges”)。child(challengeID).observeSingleEvent(of:.value,with:{(snapshot)in
如果让challengeDict = snapshot.value为? [String:任何] {
让Challenge = Challenge(id:ChallengeID,dict:ChallengeDict)
完成(挑战)
}其他{
打印(“未完成”)
}
})
  } 

观察单个事件! ! 凉。

现在,在我的TeamsDetailVC类中,我有一个Team对象,该对象除其他外还拥有ChallengeID列表。 我还将所有团队存储在Firebase中,因此我为视图控制器当前正在显示的团队设置了一个观察者:

  func watchTeamData(完成情况:@escaping()-> Void){ 
后卫让teamID = self.team?.id else {return}
FirebaseManager.fetchTeam(withTeamID:teamID){(团队)在
self.team =团队
self.fetchChallenges(forTeam:team){
完成()
}
}
  } 

请注意,它如何调用另一个函数:fetchChallenges。 这是从Firebase获取挑战的单个实例的函数:

  func fetchChallenges(适用于团队团队:团队,完成情况:@escaping()->无效){ 
self.teamChallenges.removeAll()
for team.challengeIDs {
FirebaseManager.fetchChallengeOnce(withChallengeID:ChallengeID,complete:{(challenge)in
self.teamChallenges.append(挑战)
完成()
})
}
}

现在,只要我们正在观察的团队发生任何变化(您知道,例如,如果我们向该团队添加了挑战),团队就会更新其挑战列表,然后从Firebase获取有关这些挑战的相关信息。 整齐!

那么,这意味着什么!?!?!?!?! 可以学到什么?!!!?!?! 我要开始做的一件简单的事情就是将使用Firebase .observe的函数命名为“观察”函数而不是获取函数。 Swift的全部目的是使我们能够精确地使用用于引用事物的语言,当我们使用Firebase .observe获取数据时,我们应该指定我们正在观察,而不仅仅是获取实例。 对于在Firebase中涉及.observeSingleEvent函数的函数,可能最好使用Fetch。

就这样! 与往常一样,如果您有任何疑问或有意思的事情要给我喊!