2016-05-22 3 views
0

Я занимаюсь хранением мест пользователей и элементов, назначенных им в разных таблицах. Подумайте об этом, так как есть пользователь, который продает товары, и местоположение объекта назначено пользователю.Проверка наличия ключа в сложном многомерном словаре

Я использую радиус для поиска мест пользователей. Я могу получить все предметы, если я использую радиус 10 км. Тем не менее, я хочу, чтобы отделить элементы в каждой км, такие как:

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

Проблема заключается в том, что запрос работает, как это так, если я использую «10 км», как радиус, она извлекает все от 0 до 10 км:

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

Так что журналы как:

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

Я думал, один из способов может использовать для цикла и хранить его в словарь.

Подход, который я попробовал:

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"], 
    ] 
] 

Как каждый раз, когда индекс растет, это выборку, начиная с 0ого, так что это сгрузить уже неправдоподобный материал. Но, используя словарь, возможно, я могу сделать чек, и если «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 немного.

+0

Предпочтительно, чтобы вы использовали инструкцию guard let в своем последнем примере кода вместо принудительной разворачивания и else для успешного кода кода. ;-) –

+0

@ Randy Это трюк? Каков способ преодолеть всю проблему? – senty

+0

@senty было бы полезно, если бы вы дали нам пример содержимого self.events, иначе сложно сказать, почему обновленный ответ не работает. Как насчет того, чтобы вы развернули отладчик и проверяли содержимое self.events прямо перед тем, как он оценил предложение if? – jonnydee

ответ

1

Если вы не хотите получать повторяющиеся события, вы должны просто выполнить один запрос в 25 км, извлечь все ключи и затем использовать логику на стороне клиента, чтобы отфильтровать их в отдельные группы km. Вы можете вычислить расстояние между координатами возвращенных ключей и центром вашего запроса using some math.

+0

Ваша логика имеет больше смысла, чем мой последний подход (_using для цикла 1 ... 25 и получить 25-кратное хранилище в массиве, также получить индекс-1 км, сохранить массив и получить разницу в двух массивах_). Но я не мог понять, как применять вашу клиентскую логику в Swift и получать данные за каждый километр. Не могли бы вы расширить свой ответ о том, как адаптировать эту логику после получения данных одним запросом в 25 км? – senty

Смежные вопросы