Как сохранить GeoFire со свойствами Firebase в Swift?

Я пытаюсь сохранить объект, содержащий строку имени, строку адреса и координаты местоположения. В документах кажется, что есть один способ сохранить данные Firebase и другой способ сохранить данные GeoFire.

База данных:

  var alanisawesome = ["full_name": "Alan Turing", "date_of_birth": "June 23, 1912"]
  var gracehop = ["full_name": "Grace Hopper", "date_of_birth": "December 9, 1906"]
  var usersRef = ref.childByAppendingPath("users")
  var users = ["alanisawesome": alanisawesome, "gracehop": gracehop]
  usersRef.setValue(users)

Геофайр:

  let geofireRef = Firebase(url: "https://<your-firebase>.firebaseio.com/")
  let geoFire = GeoFire(firebaseRef: geofireRef)
  geoFire.setLocation(CLLocation(latitude: 37.7853889, longitude: -122.4056973), forKey: "firebase-hq") { (error) in
      if (error != nil) {
         println("An error occured: \(error)")
      } else {
         println("Saved location successfully!")
      }
  }

Можно ли сохранить местоположение и другие данные в одном запросе? Я хотел бы сделать это в том же запросе, потому что я не хочу, чтобы пользователь мог создать объект без данных о местоположении, если запрос местоположения не удался. Или есть другой умный способ наложить это ограничение?


person user2634633    schedule 07.02.2016    source источник


Ответы (2)


Поскольку запись исходной сущности и ее геолокация — это два отдельных вызова, они будут двумя отдельными операциями записи. Одна из этих операций записи выполняется вашим кодом, другая — GeoFire. Оба вызова записывают данные в разные части дерева JSON.

Firebase недавно добавила возможность записывать в несколько мест с один update() вызов. При этом вы можете написать как геолокацию, так и сущность за один вызов. Если вы хотите это сделать, вам нужно изменить GeoFire, чтобы разрешить это.

person Frank van Puffelen    schedule 07.02.2016
comment
Я использую вызов нескольких обновлений в другом месте кода, так что это не будет проблемой. Что вы подразумеваете под изменением GeoFire? - person user2634633; 07.02.2016
comment
Чтобы запись из вашего приложения и из GeoFire происходила в одном вызове update(), потребуются изменения как в коде вашего приложения, так и в GeoFire. Поскольку GeoFire имеет открытый исходный код, вы можете клонировать/разветвить репозиторий и вносить эти изменения самостоятельно. - person Frank van Puffelen; 07.02.2016
comment
Ах, это похоже на переусердствование, я могу обойти это. Было бы здорово увидеть такую ​​функцию в будущем! - person user2634633; 07.02.2016
comment
Это точно было бы. Не стесняйтесь добавлять запрос функции в репо. - person Frank van Puffelen; 07.02.2016
comment
@FrankvanPuffelen Привет, я тоже пытаюсь это сделать в данный момент, если у вас есть время - не могли бы вы проверить мой вопрос очень быстро? - person Erik; 08.04.2016

Я также изо всех сил пытался найти решение этой проблемы, но в итоге выбрал неортодоксальный подход. Я делаю свое собственное название ключа для введенного ключа GeoFire. Почти как вин автомобиля. Первый символ — это число, определяющее мою аннотацию для использования. Следующий набор чисел — это дата, сгенерированная во время публикации, после даты — строка пользовательских данных, потому что не имеет значения, насколько длинный этот текст. И это идет как ключ. В моем приложении карт затем вызывается ключ заголовка, и я получаю заголовок в виде строки и вырезаю его. Существуют определенные символы, которые не могут быть в названии ключа GeoFire, поэтому вы должны запретить пользователю вводить их.

person user2103669    schedule 27.01.2017
comment
или замените вхождения недопустимых символов на маловероятные символы, такие как - или ^ - person aremvee; 28.06.2018