Храните координаты пользователей из карт Google в базе данных Firebase - PullRequest
0 голосов
/ 28 декабря 2018

Я уже некоторое время работаю с Google Heat Maps, и я пытаюсь сохранить местоположение пользователя вместе с некоторыми другими объектами в FireBase, а затем показать их на Google Maps.Я исследовал этот метод, но по какой-то причине введенный код не хранит местоположение пользователя, но хранит всю другую информацию, такую ​​как изображение работы, категория работы, биография и цена работы.Мне было интересно, если кто-то может помочь мне исправить мой код, чтобы показать, как сохранить местоположение пользователей для Firebase.

 @objc func handlePost() {
    let fromId = Auth.auth().currentUser!.uid
    let timestamp = Int(Date().timeIntervalSince1970)
    guard let image = JobImageView.image, let category = JobCategory.text, let description = JobBio.text, let cost = price.text else {
        print("Error")
        return
    }
    guard let uid = Auth.auth().currentUser?.uid  else {
        return
    }
    let imageName = NSUUID().uuidString
    let storageRef = Storage.storage().reference().child("job_images").child("\(imageName).png")

    if let JobImageUrl = self.JobImageView.image, let  uploadData = JobImageUrl.jpegData(compressionQuality: 0.75) {
        storageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in

            if error != nil, metadata != nil {
                print(error ?? "")
                return

            }

            storageRef.downloadURL(completion: { (url, error) in
                if error != nil {
                    print(error!.localizedDescription)
                    return
                }

                if let JobImageUrl = url?.absoluteString {
//if i attempt to store the users location, the line below crashes with the error Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
                       let myLocation = self.mapView.myLocation
                    let coords: [String: Double] = [
                        "lat": myLocation!.coordinate.latitude,
                        "long": myLocation!.coordinate.longitude
                    ]
                    let values = ["category": category, "description": description, "cost": cost, "JobImageUrl": JobImageUrl, "fromId": fromId, "timestamp": timestamp, "location": coords] as [String : Any]
                    self.registerUserIntoDatabseWithUID(uid: uid, values: values as [String : AnyObject])
                }
            })
        })
    }
   }


   private func registerUserIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
    let ref = Database.database().reference(fromURL: "https://odd-jobs-llc-f854a.firebaseio.com/")
    let usersReference = ref.child("JobPost").child(uid)
    usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in

        if err != nil {
            print("err")
            return
        }

        self.dismiss(animated: true, completion: nil)
    })

}

1 Ответ

0 голосов
/ 29 декабря 2018

Это не прямой ответ, но может привести к одному.

Проблема в том, что код, размещенный в вашем вопросе, работает, как и ожидалось.Вот что я сделал.

Сначала я хотел изолировать проблему либо от ошибки кодирования Swift, либо от ошибки кодирования Firebase.Я подключил некоторые тестовые значения, закомментировал код Firebase и добавил пару операторов print в registerUserIntoDatabseWithUID, чтобы посмотреть, является ли то, что печатается, ожидаемыми данными.Вывод в точности соответствует ожидаемому, включая две тестовые координаты 2.0 и 3.0

func testBuildingDataset() {
    let coords: [String: Double] = [
        "lat": 2.0,
        "long": 3.0
    ]
    let uid = "uid_0"
    let category = "some cat"
    let description = "some desc"
    let cost = "some cost"
    let JobImageUrl = "some jobImgUrl"
    let fromId = "some fromId"
    let timestamp = "some timestamp"

    let values = ["category": category, "description": description, "cost": cost, "JobImageUrl": JobImageUrl, "fromId": fromId, "timestamp": timestamp, "location": coords] as [String : Any]
    registerUserIntoDatabseWithUID(uid: uid, values: values as [String : AnyObject])
}

func registerUserIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
    print(uid)
    print(values)

. Вывод: набор данных (по крайней мере, то, что я указал) был надежным, а код Swift работает, как и ожидалось.Затем я раскомментировал функцию обновления Firebase и снова запустил тест.

func registerUserIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
    let usersReference = self.ref.child("JobPost").child(uid)
    usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
        if err != nil {
            print("err")
            return
        }
        //self.dismiss(animated: true, completion: nil)
    })
}

, а затем проверил мою Firebase.Записанные данные в точности соответствуют ожиданиям.

"JobPost" : {
    "uid_0" : {
      "JobImageUrl" : "some jobImgUrl",
      "category" : "some cat",
      "cost" : "some cost",
      "description" : "some desc",
      "fromId" : "some fromId",
      "location" : {
        "lat" : 2,
        "long" : 3
      },
      "timestamp" : "some timestamp"
    }
  },

Это приводит к общему выводу, что код в вопросе работает, и проблема лежит за пределами этого кода.

Это ключ

// если я пытаюсь сохранить местоположение пользователя, строка ниже вылетает с ошибкой // Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании Необязательное значение

let myLocation = self.mapView.myLocation

Таким образом, проблема в том, что либо mapView равен nil, либо myLocation равен nil

Однако этот код не был включен в вопрос, поэтому дальнейшее его изучение невозможно.Кроме того, эта ошибка может быть обнаружена при безопасной работе с вашими дополнительными компонентами

guard let myMap = self.mapView else {
   print("the mapview was nil")
   return
}
//use myMap from here as as you know it's not nil

Кроме того, если mapView - это MKMapView, у него нет свойства myLocation, только свойство userLocation, так что, по-видимому, этоПользовательский класс, который также должен быть включен в вопрос.

Надеюсь, что поможет.

...