2016-08-08 3 views
0

Ich mache umfangreiche Datenlesevorgänge aus dem Apple Health-Repository. Ich lese verschiedene Arten von Daten. Für jede Art von Daten erwarte ich alle Daten von allen Quellen für alle Zeit, indem ich eine Quellenabfrage mache, um alle Quellen pro Datentyp zu erhalten, und dann eine Datenabfrage für jede Zeit pro Quelle für den Datentyp.So überprüfen Sie, ob die App beim Warten auf eine lange Reihe von Datenverarbeitungs- und netzwerkbezogenen Rückrufen "zur Ruhe gekommen" ist

Wenn die Daten abgerufen werden, aggregiere ich sie algorithmisch und lade die Ergebnisse der Aggregation auf einen Remote-Server hoch, um die Kontodaten des Benutzers über die Geräte hinweg zu synchronisieren.

Das Ergebnis dieser Struktur ist

Per Quelle (1) eine Abfrage mit einem Rückruf, der die Liste der Quellen liefert (2) Für jede Quelle, eine andere Abfrage, die die Daten für jede Quelle zurückkehrt, in ein Callback (3) In diesem letzten Callback werden die Daten verarbeitet und zum Upload bereit gemacht. Wenn der Upload abgeschlossen ist, gibt es einen letzten Rückruf

Ich kann nicht wissen, das Timing oder die Anzahl der Abfragen. Ich habe auch bemerkt, dass manchmal HealthKit-Callbacks nicht zurückgegeben werden (ich denke, dass es etwas mit der zugrunde liegenden SQLite-Datenbank zu tun hat, die das Ansprechen/das Timing von Verbindungen stoppt?).

Also, wie kann ich wissen oder erraten, wenn der Prozess vorbei ist? Ich würde gerne einen Weg finden zu wissen, dass die App "zur Ruhe gekommen" ist, was bedeutet, dass es keine Lese-/Schreibvorgänge auf der Festplatte mehr gibt und keine Netzwerkaktivität mehr stattfindet. Was ist ein guter Weg, um beispielsweise die App-Aktivität in den letzten 30 Sekunden zu überprüfen, und wenn keine Netzwerk- oder Lese-/Schreibaktivität vorhanden ist, deklariert der Prozess 'Fertig' und stellt die Benutzeroberfläche wieder zur Verfügung?

Antwort

0

Erstellen Sie eine Singleton-Klasse, die die Anzahl der ausstehenden Abfragen verfolgt. Wenn eine neue Anforderung gestartet wird, weisen Sie sie an, einen Zähler zu erhöhen (entweder mit einem atomaren Inkrement oder indem Sie die Arbeit mit dispatch_sync auf den Hauptthread ausführen, wenn sie dort noch nicht ausgeführt wird). Wenn jede Anfrage endet, teilen Sie dieser Singleton-Klasse mit, den Zähler zu dekrementieren.

Wenn es abhängige Ressourcenanforderungen gibt (z. B. beim Anfordern von Ressource A der App mitgeteilt wird, dass sie auch Ressource B und Ressource C abrufen muss), müssen Sie diese nachfolgenden Anforderungen starten (oder zumindest in die Warteschlange stellen) eine Art, die den Zähler in der Singleton-Klasse vor erhöht, dekrementieren Sie den Zähler auf der ursprünglichen Ressource.

In dieser Singleton-Klasse, blockieren Sie die Benutzeroberfläche (wenn das wirklich notwendig ist) mit einem Ladebildschirm, wenn der Wert von Null auf ungleich Null geht, und entsperren Sie sie (Verbergen des Ladebildschirms), wenn es wieder auf Null geht.

Verwandte Themen