【发布时间】: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