Снимки Firebase неправильно анализируют данные - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь загрузить координаты широты и долготы из Firebase в свое приложение и затем отобразить маркер на карте с помощью Google Maps и Google Marker. Я знаю, что функция меток работает, потому что когда я вручную программирую координаты, я вижу заполнитель другого "человека", так что это не проблема карт Google.

Проблема, кажется, двоякая: во-первых, данные из Firebase «защелкиваются», и когда вы делаете «снимок po» в консоли, все есть, все пользователи и данные. Когда я запускаю цикл for, проблема заключается именно в этом. Когда вы делаете «po driver», он показывает ТОЛЬКО первого пользователя в firebase, но когда вы делаете «po driverSnapshot», он показывает то же самое, что и «po snapshot»

По какой-то причине Firebase не позволяет мне правильно проанализировать снимок. Я загружаю снимок в словарь и вижу свои данные, но ТОЛЬКО первый пользователь, а не остальные. независимо от того, я должен быть в состоянии извлечь координаты, используя ["мой / пример"] в качестве индекса для словаря. Когда я пытаюсь получить долготу и широту и поместить их в массив, чтобы я мог отобразить несколько координат (долгота и широта для всех пользователей в «привязке»), это не работает.

В идеале я бы хотел исправить обе проблемы. Сначала избавьтесь от неожиданно найденной ошибки 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"
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Проблема может быть из-за нескольких вещей

1) Ваш путь неверен согласно ответу Фрэнка

2) Обработка дочернего узла driver_profile

Я взял вашу структуру и импортировал ее в Firebase, а затем изменил ваш код, чтобы она заработала.

Первым делом было жесткое кодирование двух переменных, которые не были включены в вопрос. Второе - обработка дочернего узла driver_profile как собственного словаря для чтения данных из этого узла.

func loadMarkersFromFB1() {

    let ACCOUNT_PICKUP_MODE_ENABLED = "driver_profile/isPickupModeEnabled"
    let DRIVERCOORDINATE = "currentlocation"
    let ref = self.ref.child("users")
    ref.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 lastName = driverDict["last_name"] as! String
                        let childDict = driverDict["driver_profile"] as![String: Any] //**
                        let currentLocation = childDict[DRIVERCOORDINATE] as! NSArray
                        print(currentLocation[0], currentLocation[1])
                        print("\n")
                    }
                } else {
                    print("error")
                }
            }
        }
    })
}

и результаты

55.55555 -55.55555555
55.55555 -55.55555555

Возможно, вы захотите рассмотреть дополнительную проверку ошибок, когда узлы могут быть равны нулю - например, некоторые дополнительные функции могут быть лучше защищены, поэтому, если они равны нулю, они не нарушают ваш код.

Если путь вызвал проблему, вы должны принять ответ Фрэнкс.

0 голосов
/ 05 января 2019

Вы читаете /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 {

То же самое относится к любым свойствам, которые вы пытаетесь получить от вложенного узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...