同步使用 Firebase observeSingleEventOfType
Posted
技术标签:
【中文标题】同步使用 Firebase observeSingleEventOfType【英文标题】:Using Firebase observeSingleEventOfType synchronously 【发布时间】:2016-07-07 07:57:45 【问题描述】:我正在尝试使用信号量来强制同步 Firebase 数据查询,以便我可以检查数据库中已有的项目。
这是我尝试检索快照并检查重复的代码:
let sem = dispatch_semaphore_create(0)
self.firDB.child("sessions").observeSingleEventOfType(.Value, withBlock: snapshot in
snap = snapshot
dispatch_semaphore_signal(sem)
)
// semaphore is never asserted
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER)
var isDuplicate : Bool
repeat
sID = genCode()
isDuplicate = snap.hasChild(sID)
while isDuplicate
在这种情况下,我需要在 isDuplicate
循环之前等待快照返回,但信号量永远不会从 observeSingleEventOfType
块中触发。
非常感谢任何建议。
【问题讨论】:
如果你取得了任何进展,请告诉我 感谢@adolfosrs,这绝对是比我尝试做的更清洁的解决方案,而且我现在已经开始工作了,只需对您的代码进行少量编辑。我仍然不确定为什么我的信号量不起作用,但我会去阅读其他一些线程以尝试找出我做错了什么。 【参考方案1】:您可能对使用completion handler 感兴趣。
func findUniqueId(completion:(uniqueId:String)->())
self.firDB.child("sessions").observeSingleEventOfType(.Value, withBlock: snapshot in
var sID = self.genCode()
while snapshot.hasChild(sID)
sID = self.genCode()
completion(uniqueId:sID)
)
然后你会实现你所期望的
findUniqueId() (uniqueId:String) in
// this will only be called when findUniqueId trigger completion(sID)...
print(uniqueId)
// proceed with you logic...
【讨论】:
以上是关于同步使用 Firebase observeSingleEventOfType的主要内容,如果未能解决你的问题,请参考以下文章
使用 angularFire 隐式同步在 ng-repeat 中访问 Firebase 唯一 ID