我是iOS开发的新手,我正在编写一个3视图位置应用程序。 第一个视图是应用程序的主视图,第二个视图是具有多个位置的表视图,第三个视图是详细视图,用户可以在其中编辑或向表视图添加新的位置。
我在第一个和第三个视图中使用CLLocationManager,但两者的每个视图都有自己的CLLocationManager实例,因为对于详细视图我需要最好的准确性,而在MainView中我不需要最好的准确性。
所以这是问题所在: 在我的AppDelegate.m中,我收到了一个通知,当应用程序进入前台时会触发:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter] postNotificationName: @"didEnterForeground" object: nil userInfo: nil];
}
在我的第三个视图中,DetailViewController.m,我在viewDidLoad中注册此通知:
- (void) viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(enteredBackground:) name: @"didEnterBackground" object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(enteredForeground:) name: @"didEnterForeground" object: nil];
}
DetailViewController.m中的enteredForeground方法只需要再次启动位置管理器(didEnterBackground方法阻止了他)
- (void) enteredForeground: (NSNotification*) notification {
[self.locationManager startUpdatingLocation];
}
我正在使用带有ARC的XCode 4.2。 问题是,如果我访问DetailView大约10次,转到后台(来自MainView的f.e.),然后我再次输入前景,然后立即启动10个LocationManagers(这是我的NSLog所说的)。 似乎对于DetailView(以及其他视图),存在相同数量的实例,例如这些视图的访问次数。
如果这些观点消失,也许是因为NSNotification消失了,也许这些观点不会被正确发布?!
如果有人可以帮我解决这个问题,我会很感激,因为很多位置管理员都会非常努力地对电池施加压力。
提前致谢!
答案 0 :(得分:0)
我相信你需要stopUpdatingLocation
才能进入后台。否则,它将产生多个实例。