【问题标题】:Checking If Key Exists in Complex Multidimensional Dictionary检查复杂多维字典中是否存在键
【发布时间】:2016-09-19 16:38:37
【问题描述】:

我将用户的位置和分配给他们的项目存储在不同的表中。认为它是用户正在销售的物品,并且物品的位置已分配给用户。

我正在使用半径来检索用户的位置。如果我使用 10 公里半径,我可以检索所有项目。但是,我想将项目分隔到每个公里,例如:

- 1km
  - Guitar
  - Sofa
- 2km 
  - Citroen
  - Renault
  - Piano

问题是查询是这样工作的,所以如果我使用 '10km' 作为半径,它会获取从 0 到 10km 的所有内容:

let circleQuery = geoFire.queryAtLocation(center, withRadius: 10)

所以它的日志如下:

- 1km
  - Guitar
  - Sofa
- 2km 
  - Guitar
  - Sofa
  - Citroen
  - Renault
  - Piano

我认为一种方法是使用 for 循环并将其存储到字典中。

我尝试过的方法:

var items = [Int: AnyObject]()

func retrieveItems() {

  let center = CLLocation(latitude: userLatitude, longitude: userLongitude)

    for index in 1...25 {
        let circleQuery = geoFire.queryAtLocation(center, withRadius: Double(index))

       // after everything fetched

       self.items = [
           index : [itemId : value]
       ]

      // So, 'index' would be km 
      // 'itemId' is the id in db
      // 'value' would be 'key: value'

      // the database table looks like:
      //   - itemId:
      //      key:value
      //      key:value
    }
  }

字典树示例:

 let dictionary = [
    1 : [
        "item1" : ["key": "value", "key": "value"],
        "item2" : ["key": "val", "key": "val"],
        ],
    2 : [
        "item3" : ["key": "val", "key": "val"],
        "item4" : ["key": "val", "key": "val"],
        "item5" : ["key": "val", "key": "val"],
    ]
]

随着每次索引的增加,它从 0km 开始获取,所以它重新获取已经获取的东西。但是,使用字典,也许我可以检查一下,如果'itemId'已经在字典中,不要重新添加它。

我的问题是,有没有办法可以使用上述方法检查字典中是否已经添加了“itemId”,所以我不添加已经添加的项目?在上述复杂的多维字典中如何实现?


更新:我尝试了类似的方法来检查“itemId”是否存在

     if self.events.indexForKey(index) != nil {
         let radius = self.events[index]! as! Dictionary<String, AnyObject>
         print("km exists")
     } else {
         print("distance doesn't exist")
         self.items = [
             index : [itemId : value]
           ]            
     }

但它总是在else bit 内部。

【问题讨论】:

  • 最好在上一个代码示例中使用 guard let 语句,而不是为成功的代码路径使用强制展开和 else 子句。 ;-)
  • @Randy 这是诀窍吗?克服整个问题的方法是什么?
  • @senty 如果你真的给我们 self.events 的示例内容会很有帮助,否则很难说出为什么更新的答案不起作用。在评估 if 子句之前启动一个调试器并检查 self.events 的内容怎么样?

标签: ios swift dictionary nsdictionary


【解决方案1】:

如果您不想获得重复的事件,您应该只在 25 公里处执行一次查询,检索所有键,然后使用客户端逻辑将它们过滤到单独的公里组中。您可以计算返回的键坐标与查询中心using some math 之间的距离。

【讨论】:

  • 您的逻辑比我的最新方法更有意义(使用 for 循环 1...25 并检索 25 次存储在数组中,还检索索引 1 公里,存储数组并获得差异两个数组)。但我不知道如何在 Swift 中应用您的客户端逻辑,并获取每公里的数据。您能否在使用 25 公里的单个查询检索数据后扩展您对如何调整此逻辑的答案?
猜你喜欢
  • 2021-11-02
  • 2015-01-19
  • 2012-06-15
  • 2014-08-17
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2014-09-14
  • 2019-03-01
相关资源
最近更新 更多