在LocationManager中委托花费太长时间时显示UIAlert

时间:2011-10-04 03:25:28

标签: iphone

我正在尝试在我的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。

1 个答案:

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