位置服务,如何在一段时间后(30秒)更新纬度,经度?

我从位置服务获取纬度,经度,高度,准确度,速度。

我想每30秒更新一次这些信息。 为此我使用了NSTimer:

[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(locationUpdate:) userInfo:nil repeats:YES]; 

我把它放在viewDidLoad方法中。 它第一次显示输出,但第二次,当计时器调用它时,显示这个错误:

 2011-08-02 13:17:00.141 CoreLocationAssign[1120:207] This is location <__NSCFTimer: 0x4b200a0> 2011-08-02 13:17:00.142 CoreLocationAssign[1120:207] -[__NSCFTimer coordinate]: unrecognized selector sent to instance 0x4b200a0 2011-08-02 13:17:00.144 CoreLocationAssign[1120:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFTimer coordinate]: unrecognized selector sent to instance 0x4b200a0' *** Call stack at first throw: 

代码如下:

 MyCLController.h @implementation MyCLController @synthesize locationManager; @synthesize delegate; - (id) init{ if (self!=nil) { self.locationManager = [[[CLLocationManager alloc] init] autorelease]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.distanceFilter = kCLDistanceFilterNone; [self.locationManager startUpdatingLocation]; } return self; } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { //NSLog(@"Location: %@", [newLocation description]); [self.delegate locationUpdate:newLocation]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { // NSLog(@"Error: %@", [error description]); [self.delegate locationError:error]; } - (void)dealloc { [self.locationManager release]; [super dealloc]; } 

 CoreLoactionController.h - (void)viewDidLoad { locationController = [[MyCLController alloc] init]; locationController.delegate = self; [locationController.locationManager startUpdatingLocation]; [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(locationUpdate:) userInfo:nil repeats:YES]; [super viewDidLoad]; } - (void)locationUpdate:(CLLocation *)location { locationLable.text = [location description]; CLLocationCoordinate2D coordinate = [location coordinate]; NSLog(@"This is location %@",[location description]); NSLog(@"Lattitude = %@",[NSString stringWithFormat:@"%f", coordinate.latitude]); NSLog(@"Langitude = %@",[NSString stringWithFormat:@"%f", coordinate.longitude]); NSLog(@"Altitude = %@",[NSString stringWithFormat:@"%gm", location.altitude]); NSLog(@"horizontalAccuracy = %@",[NSString stringWithFormat:@"%gm", location.horizontalAccuracy]); NSLog(@"verticalAccuracy = %@",[NSString stringWithFormat:@"%gm", location.verticalAccuracy]); NSLog(@"Speed = %@",[NSString stringWithFormat:@"%gm", location.speed]); } 

我可以怎样解决这个问题? 我想每30秒更新一次地点

其实这里:

 - (void)locationUpdate:(CLLocation *)location 

你没有收到一个CLLocation *,而是一个NSTimer。 你应该使用userInfo来传送一个对象:

 [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(locationUpdate:) userInfo:location repeats:YES]; 

 -(void)locationUpdate:(NSTimer*) timer{ //probably CLLocation *location = (CLLocation*)[timer userInfo]; //... } 

有比使用计时器更好的解决scheme。 CoreLocation内置了用于延迟更新的function,与普通CoreLocation结合的定时器将摧毁手机电池。 尝试allowDeferredLocationUpdatesUntilDistanceTraveled:超时:

https :/ / dev /

定时器的位置更新是可怕的电池食用者。

CoreLocation可以告诉你什么时候位置被改变,不需要轮询。 如果我走路的话,30秒太慢了,如果我的手机躺在我的床边不动了好几个小时,它就不必要地摧毁了电池。