如何在Swift中使用Firebase属性保存GeoFire?

时间:2016-02-07 13:00:32

标签: ios swift firebase geofire

我正在尝试保存包含名称字符串,地址字符串和位置坐标的对象。在文档中,似乎有一种方法可以保存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)

GeoFire:

  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!")
      }
  }

是否可以在同一请求中保存位置和其他数据?我想在同一个请求中执行此操作,因为如果位置请求失败,我不希望用户能够创建没有位置数据的对象。或者是否存在另一种明智的方式来施加限制?

2 个答案:

答案 0 :(得分:0)

由于编写原始实体及其地理位置是两个单独的调用,因此它们将是两个单独的写操作。其中一个写操作由您的代码完成,另一个由GeoFire完成。两个调用都写入JSON树的不同部分。

Firebase最近添加了write to multiple locations with a single update() call的功能。有了它,您可以在一次调用中编写地理位置和实体。如果你想这样做,你必须改变GeoFire以允许它。

答案 1 :(得分:0)

我在寻找解决方案时也一直在努力,最后采取了非正统的方法。我为输入的GeoFire密钥创建了自己的关键标题。几乎像汽车的vin。第一个字符是一个定义我要使用的注释的数字。下一组数字是在发布时生成的日期,在日期是一串用户数据之后,因为该文本的长度无关紧要。这就是关键。在我的地图应用程序中,然后调用标题键,我将标题检索为字符串并将其剪切。某些字符不允许出现在GeoFire键标题中,因此您必须限制用户输入这些字符。