我正在启动一个带有视图加载的计时器
- (void)viewDidLoad
{
[super viewDidLoad];
locationManager.delegate = self;
[NSTimer scheduledTimerWithTimeInterval:10.0 //此处的间隔必须是浮点数
目标:自我 选择:@选择(onTick :)
userInfo:nil重复:是];
}
然后我有我的计时器方法:
- (void)onTick:(NSTimer *)计时器{
[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值翻倍?”
非常感谢!
答案 0 :(得分:5)
这里有两个错误。首先,您不应该反复拨打startUpdatingLocation
。您应该调用它一次,以便在可用时开始请求更新(当您不再需要更新时,应该调用stopUpdatingLocation
)。你的第二个错误是相信拨打startUpdatingLocation
总是会给你一个新的位置。您没有检查上一次NSTimer ran
。您正在检查上次CLLocationManager
更新位置(oldLocation.timestamp
)的时间。这可以是任意数量的时间。当您上次要求时,它可能无法获得更新。它有时可能会更新你没有要求它。
阅读Location Awareness Programming Guide。它解释了如何请求更新以及何时请求更新。通常,您打开它并告诉系统您希望更新的准确程度。然后,当事情发生变化时,让系统给你打电话。您不会反复询问位置更新。
答案 1 :(得分: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]方法将返回您当前的位置,设置distanceFilter将更新您的位置,如果您移动(2)米(车载GPS是好的吗?)。因此,只要您的位置发生变化,location属性就会自动更新。这就是我通常实现它的方式。
参考:iOS编程:The Big Nerd Ranch Guide第3版,第4章