【发布时间】:2014-01-28 17:43:16
【问题描述】:
目前在这个 iOS 应用程序中,我添加了一些我作为观察者编写的控制器到 [NSNotificationCenter defaultCenter] 以观察 NSUserDefaultsDidChangeNotification。
- (void)startObservingDefaults
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(userDefaultsDidChange)
name:NSUserDefaultsDidChangeNotification
object:nil];
}
我正在观看的用户默认设置应使用设置菜单中的PSToggleSwitchSpecifier 启用或禁用CLLocationManager。启动应用程序并将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 的小图标消失,如果我然后重新启用它,通知根本不会触发。事实上,在我返回应用程序之前,即使在其他子窗格中也不会触发其他设置。 (我在 userDefaultsDidChange 方法中对 main_queue 和 global_queue 都尝试了 dispatch_async 并没有看到任何变化)。
我的问题是我是否做错了可能导致位置管理器锁定的问题?或者这是 CLLocationManager 的一些内部队列问题?或者是其他东西?也许CLLocationManager 只有在应用程序在前台时才会启动?即使是这种情况,我应该仍然看到它至少尝试启动位置管理器的日志语句对吗?
【问题讨论】:
标签: ios objective-c nsuserdefaults cllocationmanager nsnotificationcenter