6

Ich brauche eine Möglichkeit, um den aktuellen Standort meines Benutzers zu erhalten.iPhone Core Location Architektur - Wie man es über mehrere Controller verwendet

Da ein Benutzer Freunde hat, und sie haben auch Standortdaten, ich den richtigen Weg zu gehen ist, ein Standortfeld in meine Kerndaten db, sowohl in Friend und User Einheiten.

Nun, hier ist, was ich dachte:

eine Art von Motiv-Aufnahmeleiter Singelton haben, dass, wenn ich die genaue Lage müssen sagen, dass ich ihm das CLLocationManager Updates zu starten. (für den mein Manager verantwortlich ist) Der Manager speichert den Standort im Feld user.location im DB, und Controller, die sich für die user.location-Informationen interessieren, registrieren sich unter Verwendung von KVO für diese Daten. Es klingt gut für mich, abgesehen von der Tatsache, dass ich von jedem Controller, der genaue Standorte benötigt, auf diesen Standort singelton zugreifen muss (um ihm zu sagen, dass er den Standort generieren soll, möchte ich nicht, dass Standortaktualisierungen ständig anstehen). . Außerdem versuche ich, meinen Code nicht mit einer Reihe von Singleton-Anrufen zu verschmutzen.

Ich weiß zwar, dass es vielleicht klüger ist, den Standortmanager als eine Eigenschaft innerhalb meiner User Klasse zu haben. (offensichtlich, wenn ich jetzt ein paar Benutzer im Speicher habe, werden sie alle den gleichen Standortmanager sington teilen) Ich werde eine weitere Methode zur Benutzerklasse hinzufügen und sie "StartGettingLocation" nennen, und jetzt immer wenn ein Controller den aktuellen genauen Ort benötigt kann er eine der folgenden Aktionen ausführen:

  1. Wenn in meinem Controller ich ein User-Objekt habe (die von anderen UIViewController entlang übergeben wurde), ich nenne nur seine „StartGettingLocation“ Methode und KVO sein Standortfeld.
  2. Wenn ich kein Benutzerobjekt in meinem Controller habe, bekomme ich es von meinem DB und mache wie oben beschrieben.

Klingt das richtig?

Wenn ja, was ist mir nicht sicher, wenn es möglich ist, ein neues Mitglied von MyLocationManager zu meiner Benutzerklasse hinzuzufügen (was eine Unterklasse auf managedObject ist)? Was ist der richtige Weg, dies zu erreichen?

Dank

Antwort

4

Wir setzen unsere CoreLocationManager als sharedInstance (Singletons) Muster. Ich bin mir nicht sicher, ob Sie möchten, dass Ihr verwaltetes Objekt das CoreLocation-Verhalten besitzt, weil es wirklich nicht etwas ist, was für ein User spezifisch ist, sondern ein Gerät (d. H. IPhone, iPad).

Die CoreLocationManager sollte wirklich nicht Datenbank Datensätze entweder aktualisieren. Sein Zweck ist es, aktualisierte Standorte zu senden. Etwas anderes muss auf diese Updates warten, damit Sie etwas anderes implementieren können CLLocationManagerDelegate, das wiederum das verwaltete Objekt aktualisieren könnte.

Alternativ können Sie Ihre CoreLocationManager eigenen Delegierten haben und eine @property auf CLLocation haben. Sie können KVO verwenden, um Beobachter zu benachrichtigen, dass sich ein Standort wie von Ihnen vorgeschlagen geändert hat. Ich denke, dass alles davon abhängt, ob ein Standort nur für einen Benutzer relevant ist oder ob ein Standort etwas ist, das irgendwas nutzen kann.

+0

Ich glaube nicht, dass Ihr CoreLocationManager verantwortlich ist, Standort-Updates zu senden, das ist CLLocationManager Verantwortung von Apple. Ich würde erwarten, dass Ihr CoreLocationManager dem CLLocationManagerDelegate entspricht. Dann würde es entscheiden, was mit den Standortaktualisierungen zu tun ist, wenn es in der DB gespeichert wird oder einfach eine diesbezügliche Benachrichtigung damit gepostet wird. und Ja, der Standort ist nur relavent zu dem aktuell angemeldeten Benutzer, wodurch andere Controller KVO vernünftig klingen. Hoffentlich habe ich dich richtig verstanden. – Idan

+0

Sie haben Recht. Unser CoreLocationManager sendet keine Standortaktualisierungen, es ist einfach ein Wrapper für 'CLLocationManager'. Wir haben Methoden, um die CLLocationManager-Instanz über den Manager zu starten/stoppen. Außerdem implementieren wir CLLocationManagerDelegate, um eine CLLocation-Eigenschaft für den Manager zu aktualisieren. Tut mir leid, wenn ich das nicht klar gemacht habe. –

+0

Richtig, wie können Sie anderen Controllern mitteilen, wenn sich der Standort ändert? postest du eine Benachrichtigung? Speichern in Ihrer DB und lassen Sie andere KVO es? – Idan

2

Normalerweise habe ich meinen Standortmanager als eine Eigenschaft des App-Delegaten festgelegt, und dann ist es sehr einfach, von überall in der App aus auf [[[UIApplication sharedApplication] delegate] myLocationManager] zuzugreifen.Es ist auch praktisch, eine #define in Ihrer AppDelegate.h-Datei zu verwenden, wie ...

#define commonLocationManager [[[UIApplication sharedApplication] delegate] myLocationManager] 

Auf diese Weise Sie sind nur die AppDelegate Header in jeder Klasse die Wohnorte von mit commonLocationManager.someReallyCoolProperty zugreifen müssen.

EDIT:

Jedes Mal, wenn ich meine UI müssen Änderungen in Lage zu reflektieren, oder einen anderen Staat für diese Angelegenheit, ich benutze key-value observing (KVO).