swift - GeoFire 4 观察键输入的快照大小和计费
问题描述
我正在使用 geofire 检索半径内的密钥,需要帮助来了解如何对其进行分析以降低成本。
在我用于输入密钥的代码下方:
/**
How observers work for goquery
https://stackoverflow.com/questions/45179245/geofire-swift-3-cant-stop-observing
*/
var itemsProcessed = 0
self.circleQuery!.observe(.keyEntered, with: { (key: String!, location: CLLocation!) in
itemsProcessed = itemsProcessed + 1
NSLog("Controller | initiateGeoQuery | processed key \(itemsProcessed) with value: '\(key)', it has entered the search area and is at location '\(location)' , cirecleQuery has center: \(self.circleQuery!.center) , and radius: \(self.circleQuery!.radius)")
NSLog("AEViewController waiting 60 seconds before next key entered")
sleep(60)
在这个测试用例中,我在半径外有 320 个节点,位于中国,在范围内有 2 个节点,我在欧盟。
我得到以下输出:
2020-02-15 15:01:55.198665+0000 Renal2[14181:706800] Controller | initiateGeoQuery | processed key 1 with value: 'Optional("adROWaUdK5gd6JKAfMW8DzfXpJB3")', it has entered the search area and is at location 'Optional(<xx.34939780,yy.23826435> +/- 0.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:55 Greenwich Mean Time)' , cirecleQuery has center: <xx.34939292,yy.23826781> +/- 65.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:54 Greenwich Mean Time , and radius: 50.0
2020-02-15 15:02:55.201683+0000 Renal2[14181:706800] Controller | initiateGeoQuery | processed key 2 with value: 'Optional("9fzIKheb8Ubvmu1tCA9V0uw0DOj1")', it has entered the search area and is at location 'Optional(<xx.34959316,yy.23812573> +/- 0.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:55 Greenwich Mean Time)' , cirecleQuery has center: <xx.34939292,yy.23826781> +/- 65.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:54 Greenwich Mean Time , and radius: 50.0
在 Firebase 探查器上,对于输入的第一个键:
┌────────────────────────────────────────────────┬───────────┬───────┬──────────┐
│ Path │ Total │ Count │ Average │
├────────────────────────────────────────────────┼───────────┼───────┼──────────┤
│ /GeoFire │ 118.72 kB │ 4 │ 29.68 kB │
对于第二个:
┌──────┬───────┬───────┬─────────┐
│ Path │ Total │ Count │ Average │
└──────┴───────┴───────┴─────────┘
这完全是意料之中的,而且匹配GeoFire + Swift 3 也不能停止观察
出乎意料的是,如果我使用半径外的 150 个键而不是 320 个键运行相同的测试,则带宽如下:
┌───────────────────────────────────────────────────┬───────────┬───────┬──────────┐
│ Path │ Total │ Count │ Average │
├───────────────────────────────────────────────────┼───────────┼───────┼──────────┤
│ /GeoFire │ 56.04 kB │ 4 │ 14.01 kB │
现在,考虑到当今商业模式中应用程序是全球性的真实场景,假设有 1.000.000 个密钥分布在世界各地并不少见。由于在我的例子中光线大约是 50 公里,一个现实的场景是在光线中有大约 20/30 个键。
我是否必须为 1.000.000 x 0.36 KB,差不多 370 MB 付费?每个会话?
根据下面的博客,我肯定在这里做错了
https://firebase.googleblog.com/2014/06/geofire-20.html
我可以看到:
GeoFire 对于如何在查询中查找键很聪明。它不需要将所有 GeoFire 数据加载到内存中。如果您的用户正在寻找旧金山的自行车商店,GeoFire 将不会加载纽约位置的数据,只会意识到它们位于该国的另一边。它只检查实际附近的位置。无论您的数据集有多大,这都能让您的应用程序轻巧且响应迅速。
当我开始这个项目时,我假设账单也应该很轻,你能帮我理解我做错了什么吗?
非常感谢。
解决方案
推荐阅读
- python - 根据另一个一维数组的值访问二维数组索引?
- sql - 优化 SQL 交叉连接,检查其他列中是否有任何数组值
- reactjs - 如何在 React js 中通过 id 过滤组件
- sql - 拒绝向所有用户和角色更新列
- java - 如何按 id 降序对具有 id 属性的类的列表进行排序?
- ios - 一些带有 CAGradientLayer 的视图不渲染渐变
- c++ - 为什么某些看起来像普通类型定义的表达式意外地变成了模板声明?
- setuptools - 尝试在依赖于其他 pypi 发行版的 python 中发布 pypi 发行版
- php - Github 明星在 packagegist 中没有正确显示
- swift - 用于生产的 ApplePay 集成