Архитектура расположения iPhone Core - как использовать ее на нескольких контроллерах - PullRequest
6 голосов
/ 30 марта 2012

Мне нужен способ узнать текущее местоположение моего пользователя.

Так как у пользователя есть друзья, и у них есть данные о местоположении, я думаю, что правильный путь - это поместить поле местоположения в мою базу данных основных данных, как в Friend, так и User сущностях.

Теперь вот что я подумал:

Имейте какого-нибудь менеджера локаций Сингелтона, чтобы всякий раз, когда мне нужно точное местоположение, я говорю ему, чтобы он начал CLLocationManager обновления. (за что отвечает мой менеджер) Менеджер сохранит местоположение в поле user.location в Db, а контроллеры, заинтересованные в информации user.location, зарегистрируются, используя KVO для этих данных. Это звучит хорошо для меня, кроме того факта, что я должен получить доступ к этому синглтону местоположения с каждого контроллера, который нуждается в точных местоположениях (чтобы сказать ему, чтобы он начал генерировать местоположение, я не хочу, чтобы обновления местоположения были включены постоянно). Кроме того, я стараюсь не загрязнять свой код кучей синглтон-вызовов.

Хотя, возможно, было бы разумнее иметь менеджер местоположения в качестве свойства внутри моего User класса. (очевидно, если у меня есть несколько пользователей в памяти прямо сейчас, они все будут использовать один и тот же менеджер местоположения Singelton) Я добавлю еще один метод к классу пользователя и назову его «StartGettingLocation», и теперь, когда некоторый контроллер нуждается в текущем точном местоположении, он может выполнить одно из следующих действий:

  1. Если в моем контроллере у меня есть объект User (который был передан другим UIViewController), я просто вызываю его метод "StartGettingLocation" и KVO его поле местоположения.
  2. Если в моем контроллере нет объекта User, я получаю его из своей БД и делаю, как указано выше.

Это звучит правильно?

Если так, то в чем я не уверен, так это в том, возможно ли добавить новый член MyLocationManager в мой класс User (который является подклассом для managedObject)? Как правильно это сделать?

Спасибо

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Мы реализуем наш CoreLocationManager как шаблон sharedInstance (singleton).Я не уверен, что вы хотите, чтобы ваш управляемый объект обладал поведением CoreLocation, поскольку на самом деле это не что-то специфическое для User, а скорее устройство (например, iPhone, iPad).

* CoreLocationManager действительно не должно обновлять записи базы данных.Его целью является отправка обновленных локаций.Что-то еще нужно прослушивать для этих обновлений, так что у вас может быть что-то еще, реализующее CLLocationManagerDelegate, что, в свою очередь, может обновить управляемый объект.

В качестве альтернативы вы можете иметь свой CoreLocationManager своим собственным делегатоми иметь @property на CLLocation.Вы можете использовать KVO, чтобы уведомить наблюдателей, что местоположение изменилось, как вы предложили.Я предполагаю, что все зависит от того, является ли местоположение релевантным только для пользователя, или если местоположение является чем-то, что может использовать что-либо.

2 голосов
/ 05 апреля 2012

Я обычно помещаю свой менеджер местоположения в качестве свойства делегата приложения, и тогда к нему очень легко получить доступ из любого места приложения как [[[UIApplication sharedApplication] delegate] myLocationManager].Также удобно использовать #define в вашем файле AppDelegate.h, например ...

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

Таким образом, вы просто включаете заголовок делегата приложения в любой класс, к которому вам нужен доступ с помощью commonLocationManager.someReallyCoolProperty.

РЕДАКТИРОВАТЬ:

Всякий раз, когда мне нужно, чтобы мой пользовательский интерфейс отражал изменения в местоположении или любом другом состоянии по этому вопросу, я использую наблюдение значения ключа (KVO),

...