同步使用 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的主要内容,如果未能解决你的问题,请参考以下文章

将 Firebase 函数下载或同步到本地环境

使用 Swift 4 语言同步 Firebase 的数据库

如何从 Firebase 同步检索数据?

使用 angularFire 隐式同步在 ng-repeat 中访问 Firebase 唯一 ID

android studio应用程序的Firebase同步问题

如何将firebase与react功能组件同步?