-1

我正在启动一个带有视图的计时器确实加载了

- (void)viewDidLoad
{
[超级 viewDidLoad];
locationManager.delegate = self;
[NSTimer scheduledTimerWithTimeInterval: 10.0 //这里的interval必须是float
target: self
selector:@selector(onTick:)
userInfo: nil repeats:YES];
}

然后我有我的计时器方法:

-(void)onTick:(NSTimer *)timer {
[locationManager startUpdatingLocation];

}

然后调用位置管理器,因为它是一个委托:

-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"到达位置管理器");

NSTimeInterval timePassedSinceLastLocationUpdate = fabs([oldLocation.timestamp timeIntervalSinceNow]);

NSLog(@"更新时间:%f", timePassedSinceLastLocationUpdate);

NSLog(@"--------------");
//发生其他事情
[locationManager stopUpdatingLocation];
}

但是,显示的 NSLOG 是这样的:


2012-07-31 13:02:28.092 round5[1713:f803] 进入位置管理器
2012-07-31 13:02:28.095 round5[1713:f803] 更新时间:0.000000
2012-07-31 13:02: 28.095 round5[1713:f803] --------------
2012-07-31 13:02:33.298 round5[1713:f803] 到达位置管理器
2012-07-31 13:02 :33.298 round5[1713:f803] 更新时间:5.222202
2012-07-31 13:02:33.300 round5[1713:f803] --------------
2012-07-31 13:02 :44.086 round5[1713:f803] 进入位置管理器
2012-07-31 13:02:44.086 round5[1713:f803] 更新时间:15.986345
2012-07-31 13:02:44.087 round5[1713:f803] - -------------
2012-07-31 13:02:53.297 round5[1713:f803] 到达位置管理器
2012-07-31 13:02:53.302 round5[1713:f803]更新时间:9.217123
2012-07-31 13:02:53.303 round5[1713:f803] --------------
2012-07-31 13:03:04.096 round5[1713:f803] 到达位置经理
2012-07-31 13:03:04.097 round5[1713:f803] 更新时间:20.007919
2012-07-31 13:03:04.098 round5[1713:f803] ------------- -
2012-07-31 13:03:13.297 round5[1713:f803] 进入位置管理器
2012-07-31 13:03:13.298 round5[1713:f803] 更新时间:9.202388
2012-07-31 13:03 :13.300 round5[1713:f803] --------------
2012-07-31 13:03:24.111 round5[1713:f803] 到达位置管理器
2012-07-31 13: 03:24.112 round5[1713:f803] 更新时间:20.012550
2012-07-31 13:03:24.113 round5[1713:f803] --------------

正如您在底部看到的那样,模式正常化并且它读取〜10秒(这是正确的,因为这就是设置的间隔并与系统时钟进行比较)

还有20个……哪个……我不知道它是从哪里来的。

我想我的问题是“为什么它不是一直读取 10 秒;为什么它是 NStimer 值的两倍?”

多谢!

4

2 回答 2

5

你这里有两个错误。首先,你不应该startUpdatingLocation重复调用。您应该调用一次以开始请求更新,因为它们可用(stopUpdatingLocation当您不再需要更新时应该调用)。你的第二个错误是相信打电话startUpdatingLocation总是会给你一个新的位置。你最后一次没有检查你的NSTimer ran. 您正在检查上次CLLocationManager更新位置的时间 ( oldLocation.timestamp)。这可以是任意时间。当您上次询问时,它可能无法获得更新。它可能在您不要求的时候更新了。

阅读位置感知编程指南。它解释了如何请求更新以及何时请求更新。通常,您将其打开并告诉系统您希望更新的准确程度。然后,当事情发生变化时,您让系统呼叫您。您不会反复要求位置更新。

于 2012-07-31T20:14:56.333 回答
1
- (void)viewDidLoad
{
    [super viewDidLoad];
    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [locationManager setDelegate:self];
    [locationManager setDistanceFilter:2.0];
    [locationManager startUpdatingLocation];
    [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(useLocation) userInfo:nil repeats:YES];
}

-(void)useLocation{
    NSLog(@"%@",[locationManager location]);
}

您实际上不必在委托方法中实现任何代码。[locationManager location] 方法将返回您当前的位置,如果您移动 (2) 米,设置 distanceFilter 将更新您的位置(车载 GPS 有那么好吗?)。因此,一旦您的位置发生变化,位置属性就会自动更新。这就是我通常实现它的方式。

参考:iOS 编程:大书呆子牧场指南第 3 版,第 4 章

于 2012-07-31T22:13:40.090 回答