如何让我的程序等待 Firebase 响应 IOS

Posted

技术标签:

【中文标题】如何让我的程序等待 Firebase 响应 IOS【英文标题】:How can I have my program wait for Firebase response IOS 【发布时间】:2017-09-27 13:56:36 【问题描述】:

您好,我查看了很多有关 Firebase 异步数据库的问题,但没有一个答案完全解决了我的问题:

Here is a screenshot of my firebase's structure

Here is a picture of the Output

在进入 if 之前,我的 for 循环连续打印 35 次“BACK TO FALSE”(snapshot.children 的数量)。有没有办法强制程序等待 firebase 响应?提前致谢。

        ref.child("Events").observe(.value, with:  (snapshot) in

            for child in snapshot.children
                multiple = false
                print("REMISE A FALSE")

            if let result = snapshot.children.allObjects as? [DataSnapshot] 

                    for child in result 
                        var eventForClub = child.key as! String

                        self.ref.child("Events").child("\(eventForClub)").observe(.value, with:  (snapshot) in
                            for child in snapshot.children

                                let snap = child as! DataSnapshot
                                let event = snap.value as? [String:Any]
                                let end_time_test = event?["end_time"] as? String
                                let name_time = event?["name"] as? String
                                print(end_time_test)

                                let dateFormatter = DateFormatter()
                                dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
                                dateFormatter.timeZone = TimeZone(abbreviation: "GMT+2:00")

                                let end = dateFormatter.date(from: end_time_test!)!

                                if(end.compare(self.currentDate!) == .orderedAscending || multiple == true)
                                
                                    print("date erronée")

                                

                else
                print(multiple)
                print("GOOD")
                multiple = true

【问题讨论】:

代码试图做什么?也许我可以帮助想出一种不同的方法来实现该功能。 您好 Jen,我正在尝试显示活动信息。因此,我长期有多个事件,我只需要显示 end_time 尚未通过的事件,因此我将其与 currentDate 进行了比较。但我不想只显示第一个事件,我创建了一个布尔值来记住事件是否已经显示。如您所见,我的 Firebase 中有多个事件“列表”,每个列表都针对一个俱乐部 我需要为每个俱乐部显示一个事件 您是否尝试过 firebase 查询,因为我记得我已经有用户查询从 firebase 获取项目:例如。修改查询 let ref = FIRDatabase.database().reference().child("thoughts").queryOrdered(byChild: "createdAt").queryEqual(toValue : "Today") ref.observe(.value, with: (snapshot: FIRDataSnapshot) in for snap in snapshot.children print((snap as!FIRDataSnapshot).key) ) 或者如果让 item = snapshot.value as? String self.changedName = item 从 firebase 检索数据很好。唯一的问题是这个倍数由于来自 firebase 的异步响应而无法恢复为 false。我试过了,但没有成功***.com/questions/35906568/… 【参考方案1】:

如果我理解正确,您有一个 Firebase 事件节点,并且每个事件都有一个“currentDate”变量,是某种日期格式吗?您想通过打印出来显示它们吗?

ref.child("Events").observe(.value, with:  (snapshot) in
  if snapshot.value is NSNull
     //handles errors
  
  else
     if let event= snapshot.value as? [String: String] //could be AnyObject if you have more then just strings
      if let eventClub = event["eventForClub"] as? [String: String]//Could also be a dictionary
          let currentDate = eventClub["currentDate"]
          let endTime = eventClub["end_time"]
          //compare
          //print if true/false
          
     
  
)

【讨论】:

对不起,如果我不够清楚 currentDate 是设备给出的变量。每个事件都有一个开始时间和一个结束时间我在我的代码中做的是我正在为一个给定的俱乐部经历每个事件,我只想要一个代表俱乐部。如果一个事件已经与一个俱乐部 multiple = true 相关联,那么这就是 multiple 变量。 multiple 应该返回 false(在更大的 for 循环中),但显然我的 for 循环连续 35 次打印“BACK TO FALSE”。 您目前在数据库中有多少事件?一起来。

以上是关于如何让我的程序等待 Firebase 响应 IOS的主要内容,如果未能解决你的问题,请参考以下文章

如何等待 FirebaseListObservable 的响应

如何根据ios中的api响应时间向用户发送通知

如何让我的 android 应用程序连接到实时 firebase 数据库以在实时数据库中创建更新 toast?

如何让我的 iOS 项目为正确的版本构建?

ios - 如何使用 Alamofire 等待 api 响应

如何等待快速读取数据库的结果?