Возможно, вам стоит рассмотреть подход, ориентированный на MVC. Из вашего описания у вас отсутствует представление на уровне модели вашего пользователя. Первым шагом будет определение простого класса пользователя с базовым свойством CLLocation.
@interface User {}
@property (nonatomic, retain) CLLocation *location;
@end
@implementation User
@synthesize location;
- (void)dealloc {
self.location = nil;
[super dealloc];
}
@end
Тот же экземпляр пользователя будет передан вашему контроллеру вида. Он может быть создан в делегате приложения.
Далее создайте объект службы определения местоположения для вашего приложения. Он запустит CLLocationManager и предоставит местоположение вашему пользователю. Возможно, вам придется установить точность GPS, игнорировать фреймы, которые вам не нужны, и реализовать основную логику LBS.
На данный момент у вас есть полное приложение, без какого-либо интерфейса. Это хороший дизайн в том, как его можно повторно использовать и тестировать.
Теперь уложите свой пользовательский интерфейс поверх этого. Дайте вашему корневому контроллеру указатель на экземпляр пользователя в вашем делете приложения. Контроллер вашего представления передает этот указатель на созданные им контроллеры представлений modals/navigations.
Этот контроллер начинает наблюдать за изменением местоположения пользователя в своем представленииDidLoad и реагирует соответствующим образом.
- (void)viewDidLoad {
[self observeValueForKeyPath:@"location" ofObject:self.user change:0 context:NULL];
}
Контроллер вашего вида также будет регистрироваться для уведомления, поднятого вашими объектами служб местоположения, для отображения предупреждения пользователю.
на основе других ответов:
- нет никакого реального штрафа создать несколько экземпляров CLLocationManager в коде. Единственным побочным эффектом является то, что api является асинхронным, поэтому вам нужно подождать, чтобы получить правильное местоположение в вашем контроллере просмотра. Вы можете попытаться получить текущее местоположение из диспетчера местоположений на вашем viewDidLoad с помощью locationManager.location API.
- не делитесь материалами с делегатом приложения. Это предотвратит повторное использование кода. Что делать, если вы повторно используете свои представления, а у делегата приложения нет менеджера местоположений?
Если вам нужно больше кода, спрашивайте.
У вас есть ссылки для ссылок на синглтон? спасибо – Matt
Я просто сделал быстрый поиск, но не смог найти, где я это читал. Сожалею! Но совершенно разумно, чтобы он был создан только один раз. – donkim
Я также использую singleton для моего менеджера местоположений, так что доступ к его свойствам и, что более важно, методам доступен во всем и в любое время, но также может отслеживать изменения местоположения (или изменения местоположения * доступности *) и отправлять уведомления слушателям ключевых слов, когда происходит изменение. –