我们假设我有一个像这样的Firebase设置,除了10,000个用户:
"users" : {
"user 1" : {
"latitude": 1234567,
"Longitude": 7654321,
"name": "Name 1"
},
"user 2" : {
"latitude": 1234567,
"longitude": 7654321,
"name": "Name 2"
},
"user 3" : {
"latitude": 1234567,
"Longitude": 7654321,
"name": "Name 3"
},
"user 4" : {
"latitude": 1234567,
"Longitude": 7654321,
"name": "Name 4"
},
}
生成最接近我的5位用户列表的数据密集程度最低的方法是什么?对此非常陌生,因此我能想到的唯一解决方案是需要查询所有10,000个用户。
答案 0 :(得分:2)
我对这个主题很新,所以我只能指出你正确的方向。基本上,您存储用户位置的方式并不是最佳的。最好的方法是使用GeoFire Firebase服务的新增功能。它的工作原理是您应该有一个大的位置对象,并使用该用户密钥存储这些用户的地理位置。这是一个例子。
{
Locations: {
-KH35xPkJmX0UTSG8DuM : {
"g" : "randomID",
"l" : {
"0" : "latitude",
"1" : "longitude"
}
}
}
}
{
Users: {
-KH35xPkJmX0UTSG8DuM : {
"username" : "Joe Sloan"
}
}
}
您的location对象将拥有10,000个用户密钥和地理位置。 " g"的价值和" l"使用
时设置对象 geoFire.setLocation(CLLocation(latitude: 37.7853889, longitude: -122.4056973), forKey: "firebase-hq")
Google已针对类似位置内的用户优化了查询。
let center = CLLocation(latitude: 37.7832889, longitude: -122.4056973)
// Query locations at [37.7832889, -122.4056973] with a radius of 600 meters
var circleQuery = geoFire.queryAtLocation(center, withRadius: 0.6)
circleQuery变量应包含最近用户的Firebase字典。正如我所说,我还没有机会真正深入研究,但这应该会给你一个开始。