从视图开始的NStimer确实加载,给出错误的时间!客观C iPhone

时间:2012-07-31 20:06:33

标签: iphone objective-c nstimer viewdidload

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

- (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值翻倍?”

非常感谢!

2 个答案:

答案 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章