我正在尝试在我的LocationManager花费太长时间时创建警报。在其委托方法中,我检查newLocation的时间戳,以确保它是最新的:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSDate *eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 1.0) { // process time if time is less than 1.0 seconds old.
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCount:) userInfo:nil repeats:YES];
return;
}
经过一些调试后,我意识到如果块不正确则将定时器置于其中。最终发生的事情是,计时器永远不会失效,或者说我的updateCount:方法继续运行。我认为正在发生的事情是委托不断被召唤回来,然后它继续运行更多的计时器,所以我在UIAlert之后得到了UIAlert。
我在测试项目中使用了相同的updateCount:方法来创建一个30秒的计时器并使其无效并且工作正常。然而,现在我被困住了,因为我基本上想要找到该人的位置,但是如果它需要太长时间(> 30秒),则抛出警报。我不确定我应该把这种代码放在哪里。我似乎把它放在我正在检查时间戳的代理中,因为那是我想要跟踪的错误情况。但这对我来说似乎并不适合。
有没有更好的地方进行这种检查?或者有更好的方法来完成这种任务吗?我对编程很陌生,所以我的知识有限。 TIA。
答案 0 :(得分:0)
我认为你应该做的是 - 当你拨打[locationManager startUpdatingLocation];
时设置30秒计时器现在,你可以更新你的方法,看起来像 -
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSDate *eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 1.0) { //good time found
//use this location
//either remove the 30 second timer or set a boolean
self.goodLocationFound = YES;
[locationManager stopUpdatingLocation];
}
在你的计时器方法中,你可以做 -
{
[locationManager stopUpdatingLocation];
if(self.goodLocationFound == NO)
{
//display alert
}
}