2016-09-03 5 views
0

Ich habe das Firebase-Standortmodul Geofire verwendet, um einige Orte in meiner Nähe zu suchen. Die Abfrage füllt ein Array, das dann in einer Tabelle angezeigt werden soll (über ein Reload der Tabelle). Leider wird das Array zu dem Zeitpunkt, zu dem die Tabellenansicht neu geladen wird, nicht mit Daten (count = 0) geladen. Ich benutze den asynchronen Callback (speziell den, der in Geofire gebrannt wurde, der ausgelöst werden soll, nachdem die gesamte Abfrage abgeschlossen ist), aber trotz allem, was ich bezüglich der Funktion gelesen habe, kann ich nicht scheinen, dass es funktioniert. Hier ist die Dokumentation: https://github.com/firebase/geofire-objcLaden von Daten in ein Array über einen asynchronen Anruf Probleme (Geofire, Swift)

Irgendwelche Vorschläge, wie kann ich reibungslos funktionieren, ohne einen Timer hinzufügen, um meine Tabelle neu laden Code zu verzögern? Hier

ist ein Beispielcode:

var keyArray = [String]() 
let query = geoFireSearchQuery(someLocation) 

query.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in 

    keyArray.append(key) 

}) 

query.observeReadyWithBlock({ 

    self.tableView.reloadData()     

    self.geofireRef.removeAllObservers() 

}) 

Ich habe versucht, durch mögliche Gründe zu arbeiten und verschiedene Tests mit Ich weiß jetzt, dass das Problem ist hier die Daten nicht in das Array wird geladen schnell Enough Ich dachte, mit Diese asynchrone Last würde funktionieren, aber ich fühle, dass mir etwas fehlt (noch lerne).

GELöST: Dies ist eine von Natur aus schlecht Frage war, und soll ein Beispiel dafür sein, wie man es nicht auf StackOverlow Frage zu stellen. Ich wollte es nicht mit den Details verbiegen und das war ein Fehler. Vielen Dank für Ihre Anregungen trotz fehlender Informationen.

Das Problem, das ich war, war mit, dass mein Array wie folgt erstellt wurde: Abfrage großen Datensatz, Berechnungen auf Daten, Speicher in großen Objekt, Geschäft in Array, dann Art Array von großen Objekten ausgeführt werden. Schwere Berechnungen.

Meine Hacky-Lösung war die Verwendung von keys.count als Zähler, wie viele Objekte im endgültigen (großen) Array für eine bestimmte Abfrage sein würden. Dann habe ich eine "did Set" Variable eingerichtet, die jedes Mal ausgelöst wird, wenn das große Array hinzugefügt wird. Im did Set-Block habe ich eine einfache if-Anweisung geschrieben;

static var bigArray = [HugeObjects]() { 
     didSet { 
      if self.bigArray.count == self.keys.count { 
       tableView.reloadData() 
      } 
     } 

    } 

Der Nachteil ist, dass die didSet jedes Mal ausgelöst werden ein Objekt in das Array hinzugefügt wird (bei 30 allerdings gekappt), aber ich weiß nicht, wie viel diese Leistung bewirkt. Die Lösung funktioniert jedoch, weil das TableView nun neu geladen wird, nachdem das bigArray vollständig in und sortiert wurde.

Entschuldigung für die schlechte Frage.

+0

Anruf tableView.reloadData innerhalb .KeyEntered vielleicht? – Shubhank

+0

Der Aufruf von tableView.ReloadData in KeyEntered funktioniert auch nicht. Ich habe sehr viele Kombinationen ausprobiert, aber ich denke, dass ich einige grundlegende Technik oder Kenntnisse vermisse. – Abhi

+0

ist Ihre TabelleView nicht? Sie sollten Debug-Protokolle in der numberOfRows-Methode hinzufügen – Shubhank

Antwort

0

Sieht aus wie self.geofireRef.removeAllObservers() ist der Schuldige. Wenn Sie den Beobachter entfernen, wird observeReadyWithBlock niemals aufgerufen. Sie sollten tun

nicht
self.geofireRef.removeAllObservers() 

innerhalb observeEventType

+0

Es hat nicht funktioniert (ich habe es versucht, aber ich habe es auch schon früher versucht) - Ich habe die Frage jetzt zur besseren Übersicht bearbeitet. – Abhi

+0

wird der Callback von query.observeEventType aufgerufen? –

+0

Ja, ich habe einen Drucktest zur Überprüfung verwendet. Ist es möglich, dass das Array zu groß ist und eine erhebliche Menge an Berechnungen benötigt? Der Rückruf wird ausgelöst, wenn die Daten von Firebase I-Verdacht geladen werden, da das Array für ein oder zwei Sekunden null ist. – Abhi

Verwandte Themen