Где реализовать CLLocationManager - PullRequest
       7

Где реализовать CLLocationManager

7 голосов
/ 07 декабря 2009

У меня есть приложение с панелью вкладок и 3 вкладками. Текущее местоположение пользователя будет необходимо знать на любой из трех вкладок. Будет ли лучшее место для реализации CLLocationManager в делегате приложения в этом случае?

Это нормально (хорошая практика?) Помещать методы делегата CLLocationManager в файл делегата приложения m?

Где бы вы предложили мне разместить CLLocationManager, как я собираюсь звонить -startUpdatingLocation с любой из трех вкладок?

Спасибо

Ответы [ 2 ]

5 голосов
/ 07 декабря 2009

Делегат приложения - разумное место, чтобы поместить это. Другой вариант - создать пользовательский класс фабрики-одиночки, который имеет метод класса, который возвращает делегат менеджера местоположений и реализует там методы делегата. Это сохранит чистоту класса вашего делегата приложения.

Вот реализация скелетного синглтон-класса, основанная на "Singletons in Cocoa" Питера Хоси: "Делать их неправильно" Это может быть излишним, но это начало. Добавьте ваши методы делегата в конце.

static MyCLLocationManagerDelegate *sharedInstance = nil; 

+ (void)initialize {
    if (sharedInstance == nil)
        sharedInstance = [[self alloc] init];
}

+ (id)sharedMyCLLocationManagerDelegate {
    //Already set by +initialize.
    return sharedInstance;
}

+ (id)allocWithZone:(NSZone*)zone {
    //Usually already set by +initialize.
    @synchronized(self) {
        if (sharedInstance) {
            //The caller expects to receive a new object, so implicitly retain it
            //to balance out the eventual release message.
            return [sharedInstance retain];
        } else {
            //When not already set, +initialize is our caller.
            //It's creating the shared instance, let this go through.
            return [super allocWithZone:zone];
        }
    }
}

- (id)init {
    //If sharedInstance is nil, +initialize is our caller, so initialze the instance.
    //If it is not nil, simply return the instance without re-initializing it.
    if (sharedInstance == nil) {
        if ((self = [super init])) {
            //Initialize the instance here.
        }
    }
    return self;
}

- (id)copyWithZone:(NSZone*)zone {
    return self;
}
- (id)retain {
    return self;
}
- (unsigned)retainCount {
    return UINT_MAX; // denotes an object that cannot be released
}
- (void)release {
    // do nothing 
}
- (id)autorelease {
    return self;
}
#pragma mark -
#pragma mark CLLLocationManagerDelegateMethods go here...
1 голос
/ 05 февраля 2013

Я просто включил мой LocationManager непосредственно в мой AppDelegate, так как он добавил немного кода.

Однако если вы собираетесь включить LocationManager в AppDelegate, вам следует рассмотреть возможность использования NSNotifications для оповещения ваших контроллеров представления об обновлениях местоположения, которые получает ваш AppDelegate.

Смотрите эту ссылку Отправлять и получать сообщения через NSNotificationCenter в Objective-C?

...