swift - Firebase 快照未正确解析数据

标签 swift firebase firebase-realtime-database

我正在尝试从 Firebase 下载纬度和经度坐标到我的应用程序中,然后使用 Google Maps 和 Google Marker 在 map 上显示标记。我知道地标功能有效,因为当我手动编程坐标时,我可以看到另一个“人”的占位符,所以这不是 Google map 问题。

问题似乎是双重的,第一,来自 Firebase 的数据被“快照”,当您在控制台中执行“po 快照”时,所有用户和数据都在那里。当我启动 for in 循环时,问题就出在这里。当你执行“po driver”时,它只显示 firebase 中的第一个用户,但是当你执行“po driverSnapshot”时,它确实显示与“po snapshot”相同

出于某种原因,Firebase 不允许我正确解析快照。我将快照加载到字典中,我可以看到我的数据,但只能看到第一个用户,而不能看到其他用户。无论如何,我应该能够使用 ["my/example"] 作为字典的下标来提取坐标。当我尝试获取经度和纬度并将它们放入一个数组时,这样我就可以显示多个坐标(“快照”中所有用户的经度和纬度),这是行不通的。

理想情况下我想解决这两个问题。首先摆脱 Unexpectedly found nil 错误,然后弄清楚为什么当我有 3 个具有相同信息的用户时我只得到一个用户。

对于我做错的任何帮助,我们将不胜感激。我确实执行了 pod 更新并正在运行最新的 firebase。

这是我写的函数:

func loadMarkersFromFB1() {
    DataService.instance.REF_USERS.observeSingleEvent(of: .value, with: { (snapshot) in
        if let driverSnapshot = snapshot.children.allObjects as? [DataSnapshot] {
            for driver in driverSnapshot {
                    if driver.childSnapshot(forPath: ACCOUNT_PICKUP_MODE_ENABLED).value as? Bool == true {
                        if let driverDict = driver.value as? Dictionary<String, AnyObject> {
                            let coordinateArray = driverDict[DRIVERCOORDINATE] as! NSArray **THIS IS WHERE I AM GETTING NIL ERROR**
                            print(coordinateArray)
                            let driverCoordinate = CLLocationCoordinate2D(latitude: coordinateArray[0] as! CLLocationDegrees, longitude: coordinateArray[1] as! CLLocationDegrees)
                        //    DispatchQueue.main.async(execute: {
                                let othermarker = GMSMarker()
                                othermarker.position = driverCoordinate
                        //      othermarker.userData = snap
                                othermarker.icon = UIImage(named: "driverAnnotation")
                                othermarker.map = self.driverMapView
                        //    })
                        }
                    } else {
                        self.showAlert("Test")
                    }
            }
        }
    })
}

这是 JSON:

 "users" : {
    "123456789123456789" : {
      "driver_profile" : {
        "currentlocation" : [ 55.55555, -55.55555555 ],
        "isDriverStatusPending" : false,
        "isPickupModeEnabled" : true,
        "is_userdriver" : true
      },
      "first_name" : "Carlos",
      "last_name" : "Santana",
      "mobile_number" : "2125551212",
      "provider" : "Firebase"
    },
    "2398472398472398472398472384" : {
      "driver_profile" : {
        "currentlocation" : [ 55.55555, -55.55555555 ],
        "isDriverStatusPending" : false,
        "isPickupModeEnabled" : true,
        "is_userdriver" : true
      },
      "first_name" : "Mick",
      "last_name" : "Jagger",
      "mobile_number" : "3125551212",
      "provider" : "Firebase",
      "stripe_id" : "1234354954",
      "userAddressInfo" : {
        "Home" : {
          "City" : "Anywhere",
          "State" : "AA",
          "Street" : "123 Any Street",
          "Zip" : "12345"
        }
      },
      "userPhoto" : "http://www.myphoto.com"
    }
  }
}

最佳答案

您正在阅读 /users,然后遍历其下的子节点。因此,这会为您提供每个用户的快照,据我所知应该显示两个节点。

但是这段代码看起来很可疑:

if driver.childSnapshot(forPath: ACCOUNT_PICKUP_MODE_ENABLED).value as? Bool == true {

由于拾取模式状态位于 driver_profile/isPickupModeEnabled 中,您需要从该嵌套属性中读取。所以:

if driver.childSnapshot(forPath: "driver_profile/isPickupModeEnabled").value as? Bool == true {

这同样适用于您尝试从嵌套节点获取的任何属性。

关于swift - Firebase 快照未正确解析数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54046380/

相关文章:

swift - 如何让 Swift-Wkwebview 自动填写用户名和密码?

swift - 将数据保存到数组中[Swift]

ios - Firebase:在注销之前保存数据

android - 删除并重新插入 GeoFire 位置以触发 onKeyExited 和 onKeyEntered 不起作用

ios - 如何检查 Playground 的 swift 版本?

swift - 设置按钮外部 View

Swift UIBarButtonItem 添加手势识别器

javascript - addEventListener 不起作用,总是返回 null

firebase - Ionic3 中应用程序关闭时的通知

firebase - 在 Tapkey 上处理过期 Firebase token 的最佳方法