6

Ho bisogno di un modo per ottenere il mio utente posizione corrente.iPhone Location Location Architecture - Come usarlo su più controller

Dato che un utente ha amici, e hanno anche dati di posizione, ho pensato che il modo giusto per andare fosse inserire un campo di posizione nel mio database dati db, sia nelle entità Friend e User.

Ora, qui è quello che ho pensato:

avere un qualche tipo di location manager singelton, che ogni volta che ho bisogno della posizione esatta Gli dico di iniziare le CLLocationManager aggiornamenti. (di cui è responsabile il mio responsabile) Il gestore salverà la posizione nel campo user.location nel Db ei controller interessati alle informazioni user.location registreranno utilizzando KVO a tali dati. Mi suona bene, oltre al fatto che devo accedere a questa posizione singelton da ogni controller che ha bisogno di posizioni precise (per dirgli di iniziare a generare la posizione, non voglio che gli aggiornamenti di posizione siano sempre attivi) . Inoltre cerco di non inquinare il mio codice con un sacco di chiamate a singelton.

Anche se potrebbe essere più saggio avere il gestore di posizione come proprietà all'interno della mia classe User. (ovviamente se in questo momento ho alcuni utenti in memoria, condivideranno tutti lo stesso gestore di location singelton) Aggiungerò un altro metodo alla classe utente e lo chiamerò "StartGettingLocation", e ora ogni volta che qualche controller ha bisogno della posizione corrente esatta , che può fare uno dei seguenti modi:

  1. Se nel mio controller ho un oggetto utente (che è stata approvata insieme da altri UIViewController), mi basta chiamare il suo metodo "StartGettingLocation" e KVO suo campo posizione.
  2. Se non ho un oggetto Utente nel mio Controller, lo prendo dal mio DB e faccio come sopra.

Suona bene?

In tal caso, ciò di cui non sono sicuro è se è possibile aggiungere un nuovo membro di MyLocationManager alla classe Utente (che è una sottoclasse su managedObject)? Qual è il modo giusto per realizzare questo?

Grazie

risposta

4

implementiamo il nostro CoreLocationManager come (Singleton) modello sharedInstance. Non sono sicuro che desideri che il tuo oggetto gestito possieda il comportamento di CoreLocation perché in realtà non è qualcosa di specifico per uno User, ma piuttosto un dispositivo (ad esempio, iPhone, iPad).

Il CoreLocationManager non dovrebbe aggiornare i record del database. Il suo scopo è quello di inviare posizioni aggiornate. Qualcos'altro deve ascoltare questi aggiornamenti, quindi è possibile che qualcos'altro implementa lo CLLocationManagerDelegate, che a sua volta potrebbe aggiornare l'oggetto gestito.

In alternativa, è possibile avere il proprio CoreLocationManager delegato e disporre di @property su CLLocation. Puoi usare KVO per notificare agli osservatori che la posizione è cambiata come suggerito. Immagino che tutto dipenda dal fatto che una località sia rilevante solo per un utente o se una posizione è qualcosa che qualsiasi cosa può usare.

+0

Non penso che il tuo CoreLocationManager sia responsabile di inviare aggiornamenti di posizione, è responsabilità di CLLocationManager di Apple. Mi aspetto che CoreLocationManager si conformi a CLLocationManagerDelegate. Quindi deciderebbe cosa fare con gli aggiornamenti di posizione, se salvarlo su DB o semplicemente pubblicare una notifica con esso. e Sì, la posizione è solo relavent all'utente corrente che ha effettuato l'accesso, quindi è ragionevole rendere gli altri controller KVO. Spero di aver capito bene. – Idan

+0

Sei corretto. Il nostro CoreLocationManager non invia aggiornamenti di posizione, è semplicemente un wrapper per 'CLLocationManager'. Disponiamo di metodi per avviare/interrompere l'istanza CLLocationManager dal gestore. Implementiamo inoltre CLLocationManagerDelegate per aggiornare una proprietà CLLocation sul gestore. Scusa se non l'ho chiarito molto bene. –

+0

Giusto, quindi come si fa a sapere che altri controllori sanno quando la posizione cambia? pubblichi una notifica? salva il tuo DB e lascia che sia l'altro KVO? – Idan

2

In genere inserisco il mio gestore località come proprietà dell'app delegato dell'app e quindi è molto facile accedere da qualsiasi punto dell'app come [[[UIApplication sharedApplication] delegate] myLocationManager].E 'anche utile per utilizzare un # define nel file AppDelegate.h come ...

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

In questo modo, è sufficiente includere l'intestazione applicazione delegato in ogni classe è necessario per accedere alle posizioni da con commonLocationManager.someReallyCoolProperty.

EDIT:

Ogni volta che ho bisogno del mio UI per riflettere le variazioni ubicazione, oppure qualsiasi altro stato per quella materia, io uso key-value observing (KVO).

Problemi correlati