2013-01-21 43 views
0

首先,我对iOS Dev和Objective-C非常陌生。所以请原谅任何愚蠢的问题或代码。iOS位置管理器多次触发

我一直在iPhone上测试位置服务。我有这样的代码,通过的NSTimer发射了:

- (void)startLocationTracking 
{ 

    if(self.locationManager==nil){ 
    _locationManager=[[CLLocationManager alloc] init]; 

    _locationManager.delegate=self; 

    _locationManager.desiredAccuracy=kCLLocationAccuracyBest; 

    _locationManager.distanceFilter=1; 

    self.locationManager=_locationManager; 

    } 

if([CLLocationManager locationServicesEnabled]){ 

    [self.locationManager startUpdatingLocation]; 

    } 

} 

这里是我的位置管理器功能:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 

[self timerLog]; 

NSString *deviceID = [self getUUID]; 

double lat = newLocation.coordinate.latitude; 
double lon = newLocation.coordinate.longitude; 
double alt = newLocation.altitude; 
double dir = newLocation.course; 
double spd = newLocation.speed; 
double ha = newLocation.horizontalAccuracy; 
double va = newLocation.verticalAccuracy; 

NSDateFormatter *formatter; 
NSString  *ts; 

formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"]; 

ts = [formatter stringFromDate:[NSDate date]]; 

[self geoTrackingWS :deviceID :lat :lon :alt :dir :spd :ha :va :ts]; 

[manager stopUpdatingLocation]; 

} 

出于某种原因,我的功能geoTrackingWS被多次随意射击了。 NSTimer每1分钟运行一次(就像测试一样),有时它可以正常工作,它只需要调用geoTrackingWS一次,但其他时间只需要2到3次。

我已经做了日志记录,我可以看到我的NSTimer工作正常,并且因为它应该发射。

我有一种感觉,它与我的手机上的另一个应用程序有关,但我不确定。

对此的任何帮助或见解都会很棒。

感谢

回答

1

位置管理通常有确定你的位置,包括多种方式:

  • 手机信号塔;
  • wifi网络标识;
  • GPS。

其中第一个是最准确的,但最容易得到的,第二个通常更准确的是,但需要一段更长的时间来弄清楚(因为是为查找一个网络请求),最终是最准确的,但可以需要相当长的一段时间才能找出(寻找卫星等)。

因此,它预计的行为是,位置管理器将会以越来越准确的结果做出响应,并且运行时间越长。例如,您可以在运行Google Maps时看到这一结果 - 通常会将您拉到相当广泛的区域,然后花费一些时间来获得更准确的估计值。

+0

因为有时会检查全部3个,所以我可能会达到3点吗?这可能是为什么我的geoTrackingWS函数在1到3次的任何地方运行? – Sequenzia

+0

是的,绝对。在iPhone上(有三个传感器,有些设备只有一个),可以想象你会得到三个估计值。每个新的应该比以前更准确 - 尝试记录水平和垂直精度,看看是否是这样。 – Tommy

+0

感谢您的帮助。我认为这就是它。我结束了抓住最后一个,它似乎运作良好,它更准确。谢谢。 – Sequenzia

1

你可能不希望创建一个新的CLLocationManager实例不止一次,它调用-startLocationTracking从计时器会做。从代码的外观来看,我认为你只需要调用-startLocationTracking一次,然后位置API会在有新信息时将消息发送给你的委托(你指定为self)。您可能想要重新理解委托模式,并查看使用CLLocationManager的一些示例代码。我希望有所帮助。