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