0

首先,我对 iOS Dev 和 Objective-C 非常陌生。所以请原谅任何愚蠢的问题或代码。

我一直在 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 工作正常,并且可以正常启动。

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

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

谢谢

4

2 回答 2

1

您可能不想多次创建新的 CLLocationManager 实例,从计时器调用 -startLocationTracking 即可。从您的代码的外观来看,我认为您只想调用 -startLocationTracking 一次,然后位置 API 将在有新信息时向您的委托(您指定为自己)发送消息。您可能想刷新对委托模式的理解,并查看一些使用 CLLocationManager 的示例代码。我希望这会有所帮助。

于 2013-01-21T23:53:24.320 回答
1

位置管理器通常有多种方法来确定您的位置,包括:

  • 蜂窝塔三角测量;
  • wifi网络识别;
  • 全球定位系统。

其中第一个最不准确但最容易获得,第二个通常更准确但需要一段时间才能弄清楚(因为有一个网络请求进行查找),最后一个最准确但可能需要很长时间才能弄清楚out(搜索卫星等)。

因此,位置管理器运行的时间越长,其响应的结果就越准确是预期的行为。例如,在运行地图时,您可以看到这样做的后果——它通常会很快将您锁定到相当广泛的区域,然后需要一些时间才能获得更准确的估计。

于 2013-01-22T00:06:34.003 回答