NSUserDefaultsDidChangeNotification не се задейства след изпращане на stopUpdatingLocation към CLLocationManager

В момента в това приложение за iOS добавих някакъв контролер, който съм написал като наблюдател към [NSNotificationCenter defaultCenter], за да наблюдавам NSUserDefaultsDidChangeNotification.

- (void)startObservingDefaults
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(userDefaultsDidChange)
                                                 name:NSUserDefaultsDidChangeNotification
                                               object:nil];
}

Потребителската настройка по подразбиране, която наблюдавам, трябва да активира или деактивира CLLocationManager с помощта на PSToggleSwitchSpecifier от менюто с настройки. След като стартирам приложението и изпратя startUpdatingLocation до CLLocationManager ivar, мога да отида в менюто с настройки и да деактивирам диспечера на местоположението. След това моят селектор userDefaultsDidChange ще провери дали това по подразбиране е активирано или деактивирано. Ако е активиран, изпращам startUpdatingLocation към екземпляра на диспечера на местоположението, ако е деактивиран, изпращам stopUpdatingLocation към него. Всеки път регистрира своето действие по този начин

- (void)userDefaultsDidChange
{
    if ([self duringOperationHours] && [self isEnabled]) {
        NSLog(@"\n\n\nWithin Operating Hours.\n\n\n");
        [_locationManager startUpdatingLocation];
        NSLog(@"Enabled Location Manager.");
    } else {
        NSLog(@"\n\n\nDisabled or Outside of Operating Hours.\n\n\n");
        [_locationManager stopUpdatingLocation];
        NSLog(@"Disabled Location Manager.");
    }
}

Имам други настройки, които контролират времето на деня (начален час и краен час, напр. 6 сутринта до 6 вечерта). Ако променя една от тези настройки и текущият час все още е в рамките на този времеви диапазон, регистрационният файл ще показва, че все още е „В рамките на работните часове“. и че мениджърът на местоположението е активиран.

Ако го променя така, че мениджърът на местоположението да бъде деактивиран, той регистрира и двата израза NSLog в моя метод по-горе и НАПРАВЯ изключва мениджъра на местоположението.

Проблемът идва, когато се опитам да го стартирам обратно. Така че кажете, че съм в настройките и е активирано. Деактивирам го, регистрационният файл показва, че е деактивиран и малката икона за GPS изчезва, ако след това го активирам отново, известието изобщо не се задейства. Всъщност никакви други настройки дори в други дъщерни панели не се активират, докато не се върна към приложението. (Опитах dispatch_async в метода userDefaultsDidChange както за main_queue, така и за global_queue и не видях промяна).

ВЪПРОСЪТ МИ Е Правя ли нещо нередно, което може да доведе до блокиране на това с диспечера на местоположението? Или това е някакъв вътрешен проблем с опашката за CLLocationManager? Или нещо друго? Може би CLLocationManager ще стартира само ако приложението е на преден план? Дори ако случаят беше такъв, аз трябваше все още да виждам изявленията в регистрационния файл, че поне опитва да стартира диспечера на местоположението, нали?


person Dean Kelly    schedule 28.01.2014    source източник


Отговори (1)


Няма значение, разбрах го.

Наблюдението на NSNotificationCenter на NSUserDefaultsDidChangeNotification НЕ събужда приложението. Това, което се случваше, беше, че протоколът CLLocationManagerDelegate, приложен към моя контролер, щеше да "събуди" приложението, за да направи каквото трябва с CLLocations, които бяха получени. При това събуждане, наблюдението на промяна на някои потребителски настройки по подразбиране в NSNotificationCenter ще задейства моя селектор userDefaultsDidChange.

Докато CLLocationManager се актуализираше и там, за да предупреди приложението, това щеше да позволи на контролера да извика определения селектор. Когато CLLocationManager вече не актуализира местоположението, приложението няма да бъде събудено и следователно няма да знае, че потребителските настройки по подразбиране са се променили, докато приложението не се върне на преден план.

Ще актуализирам този отговор, ако измисля по-добро решение за този странен сценарий на наблюдение.

person Dean Kelly    schedule 28.01.2014
comment
съжалявам за блъскането. разбрахте ли Аз съм в същата ситуация... Благодаря. - person Fabio Mignogna; 16.09.2015
comment
Това е отговорът. Известията на NSNotificationCenter няма да събудят приложението за това конкретно събитие. CLLocationManager събуждаше приложението и позволяваше получаването на известието тогава. След като изключите, ще трябва да върнете приложението обратно на преден план, за да получавате събитията. - person Dean Kelly; 17.09.2015