Was ist best practice für ein lang andauernder Vorgang, dass die Daten aktualisiert in Zeit anzuzeigen, iphone tableview?

StackOverflow https://stackoverflow.com/questions/1027694

Frage

Hintergrund:

Ich habe eine tableview anzeigen über 8 Sektionen jeweils gesichert mit meinen eigenen PlaceList Klasse, die eine Liste von Objekten (die Implementierung verwendet eine NSMutableArray).Es gibt rund 200 Objekte in total.Jeder Abschnitt entspricht, wie weit entfernt das Objekt aus der aktuellen Lage (z.B.innerhalb von 1 Meile, 10, 25, 50...etc).

Jedes jetzt und dann, muss ich reagieren, um asynchrone Benachrichtigungen von CoreLocation, die von mir verlangen, zu berechnen, welcher Abschnitt jedes Objekt gehört, aktualisieren Sie die Entfernung für jedes Objekt (das in jeder Zelle angezeigt), und auch das resort jede Liste, laden Sie dann die Tabelle anzeigen.Ich habe auch diese operation in viewWillAppear.

Im Betrieb führt, dass der update (eine Methode, die auf PlaceList), die ich benutzt habe @synchronized(self) in Fall wird es aufgerufen wird, von mehr als einem thread vom OS (ich weiß nicht, verwenden Sie einen anderen thread für die es selbst bei vorhanden).Derzeit jedoch ist diese operation die Ergebnisse in der UI-Gefühl "frozen" von Zeit zu Zeit, so dass ich bin auf der Suche nach Möglichkeiten, es zu tun in einem eigenen thread.

Frage:

  • Was ist der beste Weg, um diese Art von lange Laufenden Betrieb auf die Daten sichern einer Tabelle anzeigen?Soweit ich sehen kann, es ist nicht sicher, spin-off einen hintergrund-thread zu tun, den Betrieb, als auch wenn ich verwenden performSelector nachladen der Tabellenansicht auf dem Haupt-thread, wenn Sie fertig ist, ist es immer noch möglich, dass der Benutzer auf eine Zelle, während die operation ausgeführt wird und die Daten nicht im Einklang mit dem display.Und das hinzufügen jede Art von sperren würde nur die Niederlage der Zweck.

  • Tun die Benutzeroberfläche und CoreLocation locationManager senden Sie Ihre Benachrichtigungen auf dem gleichen thread, d.h.kann ich getrost verzichten mit dem @synchronized(self) auf der PlaceList?

War es hilfreich?

Lösung

Hier ist mein Verständnis des Problems.Sie haben eine große Liste von Daten, und irgendwann wird es ungültig.Um es zu bekommen gilt wieder, Sie haben zu tun einige Verarbeitung vor, können Sie repaint den Tisch.

Wenn dies richtig ist, hier sind ein paar Optionen.

1) Verdoppeln, Puffer mit Ihren Daten.Solange Sie die Anzeige von etwas, das "" richtig, die Benutzer können interagieren mit es gut.Wenn Sie Ihre trigger, um zu verarbeiten Ihre Daten, arbeiten im hintergrund mit einer Kopie, und wenn es ist bereit, neu zu zeichnen, komplett-update.Das update kann abrupt und groß, aber die angezeigten Daten stets korrekt, oder zumindest sane, und die Benutzeroberfläche wird weiterhin funktionieren, und nicht erschrecken den Benutzer.

Diese weitgehend vermeidet das threading-Problem, da die Benachrichtigungen sind nicht das ändern von Daten und versuchen zu zeigen, dass es zur gleichen Zeit.

AFAIK, die Facebook-Anwendung scheint dies zu tun, sowie TwitterFon.Mindestens das ist, wie es sich anfühlt.Sicher schwer zu sagen.

2) lade-Bildschirm!Nicht lustig, aber es funktioniert.Wenn Sie wissen, dass die Daten schlecht ist, werfen Sie einen halbtransparenten panel und sagen die Benutzer zu hängen ein bisschen.

Es ist wirklich darauf an update jetzt oder später.Sie haben zu entscheiden, welche trade-offs machen am meisten Sinn in Ihrer Anwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top