位置更新方法调用不必要的iPhone

时间:2011-09-15 14:07:34

标签: iphone core-location

我正在使用coreLocation制作我的应用。下面是我的类,它将位置更新发送到委托类,该类接收位置坐标并使用它们。

问题是,当我第一次启动我的应用程序时,我进入主视图(使用位置坐标的类是uiTableView,第二个是在主视图旁边),它不调用didUpdateToLocation,因为视图尚未加载

然后当它的视图加载时,它会被调用两次,它应该被调用一次。然后再次当我处理我的应用程序n进入主视图并按下iPhone的中央按钮,应用程序转到后台然后再次当我在主视图上启动它locationDidUpload方法被调用4次虽然视图尚未加载其中它是实现。我不想要这个,因为它让系统忙碌。请建议。

- (id)init {


self = [super init];

if(self != nil) {
    self.locMgr = [[[CLLocationManager alloc] init] autorelease]; // Create new instance of locMgr
    self.locMgr.delegate = self; // Set the delegate as self.
    self.locMgr.desiredAccuracy=kCLLocationAccuracyThreeKilometers;//check
    self.locMgr.distanceFilter=500;//check in meters
   [self.locMgr startUpdatingLocation];
        }

return self;
}


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
if([self.delegate conformsToProtocol:@protocol(CoreLocationControllerDelegate)]) {  // Check if the class assigning itself as the delegate conforms to our protocol.  If not, the message will go nowhere.  Not good.
    NSLog(@"core");
    [self.delegate locationUpdate:newLocation];

}
}



- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
if([self.delegate conformsToProtocol:@protocol(CoreLocationControllerDelegate)]) {  // Check if the class assigning itself as the delegate conforms to our protocol.  If not, the message will go nowhere.  Not good.
   if (error.code==kCLErrorDenied) {
        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Permission Denied" message:@"Please allow location to retrieve location" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil   , nil];
        [alert show];
        [alert release];


        [locMgr stopUpdatingLocation];
        [locMgr release];

        locMgr=nil;
    }

    [self.delegate locationError:error];
}
}

- (void)dealloc {
[self.locMgr release];
[super dealloc];
}

@end

2 个答案:

答案 0 :(得分:2)

这是正常的,如果每次都获得不同的精度,则会被调用两次。

检查每个呼叫的horizontalAccuracy newLocation属性,第二个可能比第一个近似发送的第一个更准确(即使您使用kCLLocationAccuracyThreeKilometers以获得所需的准确度)

这与在GoogleMaps地图上显示您的位置的“地图”应用程序完全相同:您首先要有一个非常接近位置的大蓝圈,然后快速获得更准确的位置。

答案 1 :(得分:0)

您可以尝试将邮件startMonitoringSignificantLocationChanges发送到CLLocationManager而不是startUpdatingLocation吗?