创建计时器以超时并弹出警报

时间:2011-09-10 06:58:07

标签: iphone nstimer

我正在尝试使用CLLocationManger获取最近的位置。如果我不能在30秒内得到一个,我想要一个警告弹出说“我们现在遇到问题”或类似的东西。在我的CLLocationManager委托中,我这样做:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSDate *eventDate = newLocation.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
    NSTimer *timer;
    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:NO];  
        return;
    }

我的updateCount方法:

- (void)updateCount:(NSTimer *)aTimer {
    count++;
    NSLog(@"%i", count);
    if (count == 30) {
        [aTimer invalidate];
        NSLog(@"Timer invalidated");
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Server Down" message:@"Sorry, but we cannot find your location at this time.  Please try again later." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alert show];
        [alert release];
    }
}

但我没有看到我的警报被解雇。我尝试了一个重复的计时器,但在它击中30秒后,显示警报,它再次重复。所以我不太清楚我在这里做错了什么。谢谢!

2 个答案:

答案 0 :(得分:0)

我检查了文档,并在其中找到了以下段落。

  

但是,对于重复计时器,您必须通过调用其invalidate方法自行使计时器对象无效。调用此方法请求从当前运行循环中删除计时器;因此,您应该始终从安装计时器的同一个线程中调用invalidate方法。

因此,为了使计时器失效,请尝试调用performSelector。

我不确定天气是否会有所帮助,但如果有效,请在此发布,以便其他人也可以利用。

答案 1 :(得分:0)

只是对updateCount方法的一个小更新:

- (void)updateCount:(NSTimer *)aTimer { 
    count++; 
    NSLog(@"%i", count); 
    if (count == 30) { 
        [aTimer invalidate]; 
        NSLog(@"Timer invalidated"); 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Server Down" message:@"Sorry, but we cannot find your location at this time.  Please try again later." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
        [alert show]; 
        [alert release];
        [timer invalidate];
        timer = nil;
    } 
} 

请勿在locationManager方法中使用NSTimer *timer;。而是直接调用timer = [[NSTimer ....]]方法,我认为因为updateCount方法中有一个参数,即NSTimer,我们使用不同的NSTimer实例,所以这里基本上是问题。尝试不使用updateCount方法中的参数,并使.h文件中声明的计时器无效。