2016-05-22 16 views
0

Ich speichere die Benutzerorte und die ihnen zugewiesenen Elemente in verschiedenen Tabellen. Denken Sie daran, dass es Artikel gibt, die der Benutzer verkauft, und der Standort des Artikels dem Benutzer zugewiesen wird.Überprüfen, ob der Schlüssel im komplexen mehrdimensionalen Wörterbuch vorhanden ist

Ich verwende Radius zum Abrufen der Standorte von Benutzern. Ich kann alle Gegenstände abrufen, wenn ich 10km Radius benutze. Allerdings mag ich Artikel zu jedem km voneinander zu trennen, wie zB:

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

Das Problem ist, dass die Abfrage wie das funktioniert so, wenn ich ‚10km‘ als Radius verwende, holt sie alles von 0 bis 10 km:

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

So meldet es wie:

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

ich einen Gedanken Weise eine Verwendung für Schleife werden könnte und es in ein Wörterbuch zu speichern.

Der Ansatz, den ich versuchte:

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 
    } 
    } 

Beispiel Wörterbuchbaum:

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

Wie jedes Mal Erhöhung der Index von 0km beginnt es zu holen, so dass es wieder fetching bereits geholt Zeug. Aber mit dem Wörterbuch kann ich vielleicht eine Überprüfung durchführen und wenn die 'itemId' bereits im Wörterbuch ist, füge sie nicht wieder hinzu.

Meine Frage ist, gibt es eine Möglichkeit, ich kann überprüfen, ob die 'itemId' bereits im Wörterbuch mit dem obigen Ansatz hinzugefügt wurde, so dass ich nicht bereits hinzugefügt Elemente hinzufügen? Wie kann man es in einem komplexen mehrdimensionalen Wörterbuch wie dem obigen erreichen?


Update: Ich habe versucht, so etwas zu überprüfen, ob die "itemId" existiert

 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] 
      ]    
    } 

Aber es ist immer in else Bit geht.

+0

Es ist vorzuziehen, dass Sie in Ihrem letzten Codebeispiel eine Anweisung guard let anstelle einer Klausel forced unwrapping und else für den erfolgreichen Codepfad verwenden. ;-) –

+0

@Randy Ist das der Trick? Wie kann man das ganze Problem überwinden? – senty

+0

@senty es wäre hilfreich, wenn Sie uns Beispielinhalte von self.events geben, sonst ist es schwierig zu sagen, warum die aktualisierte Antwort nicht funktioniert. Wie wäre es, wenn Sie einen Debugger hochfahren und den Inhalt von self.events prüfen, bevor er die if-Klausel auswertet? – jonnydee

Antwort

1

Wenn Sie keine doppelten Ereignisse erhalten möchten, sollten Sie nur eine Abfrage bei 25 km ausführen, alle Schlüssel abrufen und diese dann mithilfe der clientseitigen Logik in einzelne km-Gruppen filtern. Sie können den Abstand zwischen den zurückgegebenen Schlüsselkoordinaten und der Mitte Ihrer Abfrage berechnen using some math.

+0

Ihre Logik macht mehr Sinn als meine neueste Annäherung (_using für Schleife 1 ... 25 und Abrufen 25-mal Speicher in Array, auch Index-1 km abrufen, Array speichern und Differenz von zwei Arrays_). Aber ich konnte nicht herausfinden, wie man in Swift die clientseitige Logik anwendet und Daten für jeden Kilometer erhält. Können Sie bitte Ihre Antwort darauf erweitern, wie Sie diese Logik nach dem Abrufen von Daten mit einer einzigen Abfrage von 25 km anpassen können? – senty

Verwandte Themen