我正在尝试使用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秒后,显示警报,它再次重复。所以我不太清楚我在这里做错了什么。谢谢!
答案 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文件中声明的计时器无效。