6

Necesito una forma de obtener la ubicación actual de mi usuario.Arquitectura de ubicación principal de iPhone: cómo usarla en varios controladores

Dado que un usuario tiene amigos, y también tienen datos de ubicación, creo que el camino correcto es poner un campo de ubicación en mi base de datos, tanto en Friend como en User.

Ahora, esto es lo que pensé:

tener algún tipo de gerente de locación singelton, que cada vez que necesito la ubicación exacta le digo a iniciar los cambios CLLocationManager. (el cual es responsabilidad de mi gerente) El administrador guardará la ubicación en el campo user.location en el Db, y los controladores interesados ​​en la información de ubicación del usuario se registrarán usando KVO con esos datos. Me parece bien, además del hecho de que tengo que acceder a esta ubicación singelton desde cada controlador que necesita ubicaciones precisas (para decirle que empiece a generar la ubicación, no quiero que las actualizaciones de ubicación estén encendidas todo el tiempo) . Además, trato de no contaminar mi código con un montón de llamadas singelton.

Creo que quizás sea más inteligente tener el administrador de ubicación como propiedad dentro de mi clase User. (obviamente, si tengo algunos Usuarios en memoria en este momento, todos compartirán el mismo gestor de ubicación singelton) Agregaré otro método a la clase de usuario y lo llamaré "StartGettingLocation", y ahora cada vez que algún controlador necesite la ubicación precisa actual , que puede hacer uno de los siguientes:

  1. Si en mi controlador tengo un objeto de usuario (que fue pasado a lo largo de por sí UIViewController), acabo de llamar a su método "StartGettingLocation" y MVA su campo de ubicación.
  2. Si no tengo un objeto Usuario en mi Controlador, lo obtengo de mi DB y hago lo anterior.

¿Esto suena correcto?

Si es así, de lo que no estoy seguro, es si es posible agregar un nuevo miembro de MyLocationManager a mi clase de usuario (que es una subclase en managedObject)? ¿Cuál es la forma correcta de lograr esto?

Gracias

Respuesta

4

Implementamos nuestra CoreLocationManager como un patrón sharedInstance (Singleton). No estoy seguro de que desee que su objeto gestionado posea el comportamiento CoreLocation porque realmente no es algo específico de un User, sino más bien un dispositivo (es decir, iPhone, iPad).

El CoreLocationManager realmente no debería actualizar los registros de la base de datos tampoco. Su objetivo es enviar ubicaciones actualizadas. Algo más necesita escuchar estas actualizaciones, por lo que podría tener que implementar otra cosa, el CLLocationManagerDelegate, que a su vez podría actualizar el objeto administrado.

Alternativamente, podría tener su CoreLocationManager ser su propio delegado y tener un @property en CLLocation. Puede usar KVO para notificar a los observadores que una ubicación ha cambiado como sugirió. Supongo que todo depende de si una ubicación solo es relevante para un usuario o si una ubicación es algo que cualquier cosa puede usar.

+0

No creo que su CoreLocationManager sea responsable de enviar actualizaciones de ubicación, esa es la responsabilidad de CLLocationManager de apple. Esperaría que tu CoreLocationManager se conforme al CLLocationManagerDelegate. Luego, decidiría qué hacer con las actualizaciones de ubicación, si guardarlo en DB o simplemente publicar una notificación con él. y Sí, la ubicación solo es relevante para el usuario que está conectado actualmente, por lo que hacer que otros controladores KVO parezcan razonables. Espero haber entendido bien. – Idan

+0

Estás en lo correcto. Nuestro CoreLocationManager no envía actualizaciones de ubicación, simplemente es un contenedor para 'CLLocationManager'. Tenemos métodos para iniciar/detener la instancia de CLLocationManager desde el administrador. También implementamos CLLocationManagerDelegate para actualizar una propiedad CLLocation en el administrador. Lo siento si no lo dejé muy claro. –

+0

Bien, entonces, ¿cómo informa a otros controladores sobre cuándo cambia la ubicación? ¿Publica una notificación? guarda en su base de datos y deja que otros KVO? – Idan

2

Normalmente pongo mi administrador de ubicación como una propiedad del delegado de la aplicación, y luego es muy fácil acceder desde cualquier lugar de la aplicación como [[[UIApplication sharedApplication] delegate] myLocationManager].También es útil utilizar un # define en su archivo AppDelegate.h como ...

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

De esta forma, basta con incluir la cabecera aplicación delegado en cualquier clase que necesita para acceder a los lugares de la commonLocationManager.someReallyCoolProperty.

EDIT:

Cada vez que necesito mi interfaz de usuario para reflejar los cambios de ubicación, o cualquier otro estado para el caso, yo uso key-value observing (MVA).

Cuestiones relacionadas