Два CLLocationManager мешают

У меня есть два CLLocationManage в приложении. Первый из них предназначен для наблюдения за регионами-маяками, а другой — для наблюдения за обычным CLRegion.

Первый в A.m.

// Do any additional setup after loading the view.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

Второй в Б.м.

  gpsLocationManager = [[CLLocationManager alloc] init];
  gpsLocationManager.delegate = self;

Я почти уверен в последнем, я не вызывал startMonitoringForRegion ни в одном регионе-маяке. Тем не менее, кажется, что gpsLocationmanager в B продолжает получать обратный вызов enterRegion из того, что в A. Таким образом, это заканчивается моей проверкой типа параметра переданного региона, чтобы gpsLocationManager не отвечал на какой-либо обратный вызов из входа в область маяка.

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
  NSLog(@"%d regions under monitor:", self.gpsLocationManager.monitoredRegions.count);
  NSLog(@"%d regions in regionArray:", self.regionArray.count);
  NSLog(@"Region type %@:", [region class]);
 if(![region isKindOfClass:[CLBeaconRegion class]]){

Есть идеи?

С уважением Хаммер


person Hammer    schedule 10.11.2014    source источник
comment
Поможет ли синглтон в этом случае? Статический экземпляр диспетчера местоположений, существующий на время работы приложения. Таким образом, у вас будет только 1 менеджер местоположений. В противном случае, возможно, у вас может быть логический флаг, чтобы определить, должен ли он реагировать на обновление местоположения.   -  person Zhang    schedule 10.11.2014
comment
Спасибо. На самом деле я пытался использовать синглтон. Однако, поскольку мой мониторинг относится к разным категориям, для которых установлена ​​разная точность, частота и даже типы регионов. В конце я возвращаю два подхода CLLocationmanager. Да, ваше решение подходит для использования, однако мне немного любопытно, почему возникает проблема, о которой сообщается, поскольку я использую два разных экземпляра.   -  person Hammer    schedule 10.11.2014


Ответы (3)


Функциональность CoreLocation предоставляется для всего приложения.

Вот почему общий шаблон состоит в том, чтобы инициализировать ваш CLLocationManager в вашем AppDelegate и сделать его CLLocationManagerDelegate.

Если вам нужно получить доступ к одному CLLocationManager из нескольких UIViewController, я бы сделал его свойством вашего AppDelegate. Затем вы можете перенаправить обратные вызовы, которые вам нужны, на UIViewController, если они были инициализированы и видны.

person davidgyoung    schedule 10.11.2014
comment
Проблема для меня в том, что у меня разные типы регионов. В некоторых регионах мне нужно обычное обновление с хорошей точностью, например kCLLocationAccuracyBest, в то время как в некоторых требуется обновление со значительными изменениями с точностью, например kCLLocationAccuracyKilometer и т. д. В этом сценарии сложно объединить все в один диспетчер местоположений. - person Hammer; 11.11.2014
comment
Сегодня я попробовал еще раз и еще одна интересная находка. LocationManager в A.m, который отслеживает область маяка, также получает выход из региона, инициированный географическим регионом, наблюдаемым в диспетчере местоположения в B.m. Я делаю еще одну попытку создать C.m с другим менеджером местоположения для наблюдения за географическим регионом. Не мешает тому, что в Б.м. Пока что это происходит только в том случае, когда один отслеживает область маяка, а другой отслеживает георегион. - person Hammer; 11.11.2014

Я столкнулся с той же проблемой, когда создал 2 класса (1 для Geo Fencing (CLRegion или CLCircularRegions) и 2 для Beacon REgions (CLBeaconRegions). Оба являются одноэлементными классами со свойством, называемым lManager (CLLocationManager).

изначально я пробовал с этой условной проверкой

if (manager == self.gpsLocationManager) {
  // Do things 
}

как сказал Вилмар. Это не работает..

после глубокого исследования классов регионов я использовал приведенное ниже условие для изменения регионов. БЫВШИЙ :

func locationManager(manager: CLLocationManager!, didStartMonitoringForRegion region: CLCircularRegion!) {

      if(region.isMemberOfClass(CLCircularRegion)){
    // Do things. here 
 }
}

Это работает для меня.

Привет :р

person Community    schedule 29.03.2015

В ваших A.m и B.m вы можете проверить, является ли отвечающий locationManager интересующим вас locationManager, и отреагировать соответствующим образом. Однако я бы попытался придерживаться одного менеджера местоположения, как упоминал davidgyoung.

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    if (manager == self.gpsLocationManager) {
        // do things
    }
    else {
        // this is another location manager which I am not interested in
    }
}
person Wilmar    schedule 10.11.2014
comment
Разве делегат не должен в любом случае использовать правильный экземпляр? Конечно, ваше решение будет работать только в том случае, если один и тот же делегат использовался для нескольких экземпляров диспетчера местоположений? - person trojanfoe; 10.11.2014
comment
@trojanfoe Согласен с тем, что вы говорите. Просто предложил проверить, так как у нас нет полного контекста кода. - person Wilmar; 11.11.2014
comment
это было то, что я пробовал в первую очередь, и это не решило проблему - person Hammer; 11.11.2014