目前在这个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
只有在应用程序位于前台时才会启动?即使是这种情况,我应仍然会看到至少尝试启动位置管理器的日志语句吗?
答案 0 :(得分:0)
没关系我弄清楚了。
观察NSNotificationCenter
上的NSUserDefaultsDidChangeNotification
不会唤醒应用程序。发生的事情是应用于我的控制器的CLLocationManagerDelegate
协议将“唤醒”应用程序以执行收到的CLLocation
所需的内容。在此唤醒后,NSNotificationCenter
中某些用户默认值的更改将会触发我的选择器userDefaultsDidChange
。
只要 CLLocationManager
正在更新并在那里提醒应用程序,它将允许控制器调用指定的选择器。当CLLocationManager不再更新位置时,应用程序将不会被唤醒,因此在应用程序返回到前台之前不知道任何用户默认值已更改。
如果我为这个奇怪的观察场景提出更好的解决方案,我会更新这个答案。