将stopUpdatingLocation发送到CLLocationManager后NSUserDefaultsDidChangeNotification不会触发

时间:2014-01-28 17:43:17

标签: ios objective-c nsuserdefaults cllocationmanager nsnotificationcenter

目前在这个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语句并且 DOES 关闭位置管理器。

当我尝试重新启动它时问题就出现了。所以说我在设置中并且已启用。我禁用它,日志显示它被禁用,GPS的小图标消失,如果我重新启用它,通知根本不会触发。实际上,在我回到应用程序之前,即使在其他子窗格中也没有其他设置也不会触发。 (我已经在dispatch_async方法中尝试了userDefaultsDidChange到main_queue和global_queue,但没有看到任何变化。

我的问题我做错了什么可能会导致这种情况与位置管理器锁定?或者这是CLLocationManager的一些内部队列问题?或者是其他东西?也许CLLocationManager只有在应用程序位于前台时才会启动?即使是这种情况,我仍然会看到至少尝试启动位置管理器的日志语句吗?

1 个答案:

答案 0 :(得分:0)

没关系我弄清楚了。

观察NSNotificationCenter 上的NSUserDefaultsDidChangeNotification不会唤醒应用程序。发生的事情是应用于我的控制器的CLLocationManagerDelegate协议将“唤醒”应用程序以执行收到的CLLocation所需的内容。在此唤醒后,NSNotificationCenter中某些用户默认值的更改将会触发我的选择器userDefaultsDidChange

只要 CLLocationManager正在更新并在那里提醒应用程序,它将允许控制器调用指定的选择器。当CLLocationManager不再更新位置时,应用程序将不会被唤醒,因此在应用程序返回到前台之前不知道任何用户默认值已更改。

如果我为这个奇怪的观察场景提出更好的解决方案,我会更新这个答案。