2011-01-13 30 views
0

我在iPhone上遇到位置奇怪的问题。它看起来很疯狂,但似乎是可重复的。在我的应用程序中,我使用Core Location来获取某些用户操作的位置数据。通常它似乎工作。但是,在应用程序部署在没有以前版本的设备上(从XCode或通过iTunes无关紧要)之后的第一次运行中,它根本不起作用。 无论
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
也不
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
被调用。我甚至没有获得手机信号塔的坐标。 GPS弹出的唯一标志是要求允许访问位置数据。如果我退出应用程序(并退出,我的意思是真正杀死它,而不是仅仅投入后台),在下一次运行时,一切都会开始正常工作。iPhone位置数据在第一次启动时不起作用

一些更多的细节。 正如我需要在那里用户执行某些动作的位置,我用以下方法:

  • 我使用相同的共享CLLocationManager对象(kCLLocationAccuracyBest)和相同的共享委托对象。
  • 当用户执行操作时,我打电话startUpdatingLocation并创建一个后台线程,基本上是定时器,但还有更多不相关的东西。它每15秒醒来一次
  • 我累积的修复程序由- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
  • 当后台线程唤醒时,它检查修复和时间。如果有足够的修复,它会停止等待。如果超过1分钟的时间间隔,它也会停止等待。
  • “停止等待”=调用某种方法。该方法寻求收到(如果有的话)之间的最佳解决方案并对其进行处理。它也叫stopUpdatingLocation

我没有看到任何明显的缺陷。而且,同样的二进制文件通常在第二次启动时开始工作。任何想法为什么?我疯了吗?

+0

当您第二次启动应用程序时,是否还有弹出窗口? 如果没有,那么在您的代码中可能会出现某种竞争条件,并由此弹出窗口触发。 – 2011-01-13 14:54:29

回答

2

看来我自己找到了答案。我的应用程序需要一些启动准备。不同的是,在第一次运行时,我做了一些大的一次性工作(通过网络进行一些大的同步)。这个长时间的任务在后台线程中完成。然后相同的线程进行“通用初始化”,包括创建CLLocationManager对象。当然,后台线程很快就会离开CLLocationManager而没有任何RunLoop。在第二次启动时,不需要大的同步,并且在UI线程上执行“公共初始化”。因此,CLLocationManager正在主RunLoop上运行,并愉快地提供修复。总结一下:当你创建CLLocationManager对象时,在正确的线程上(或者更确切地说NSRunLoop/CFRunLoop)执行它是非常重要的。

相关问题