我首先使用CoreLocation框架。我有一个表格,通过按钮单击应该添加一个新位置,并且应该始终显示和更新到表中所有条目的距离。这就是为什么我有一个 BOOL 保存新位置,单击按钮时将其设置为是。因为更新仍然需要在后台进行,但是当单击按钮时,只会添加一个新条目。
目前我的观点是DidLoad:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
这是我的委托方法:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
self.currentLocation = newLocation;
if(self.saveNewLocation){
[PointOfInterest addPointOfInterest:newLocation withAddress:@"" andNotes:@"" inManagedObjectContext:self.cdh.context];
self.saveNewLocation = NO;
}
[self updateAllDistances];
}
这是我的按钮:
- (IBAction)addLocationClicked:(id)sender {
self.saveNewLocation = YES;
}
但目前的问题是,当您单击此按钮时,有时会有很大的滞后,没有任何反应。有时会立即添加新位置。如何避免这种延迟并通过单击立即添加新位置?
对位置管理器委托的更新调用之间的时间间隔是可变的,因此您遇到的行为是预期的。
CLLocationManager
有一个名为 location
的属性,该属性返回用户的最后一个已知位置(如果从未在应用中使用过位置管理器,则返回 nil)。
与其等待位置管理器更新,不如获取用户的最后一个已知位置:
- (IBAction)addLocationClicked:(id)sender {
CLLocation *location = self.locationManager.location;
if (location && [NSDate timeIntervalSinceReferenceDate] - location.timeStamp.timeIntervalSinceReferenceDate < 60 * 10){
//Do something with the location if the location manager returns a location within the last 10 minutes
} else {
self.saveNewLocation = YES;
}
}
如果应用程序从未询问过它的位置,您可能会得到 nil,在这种情况下,您必须等待位置管理器更新。 但除此之外,您可以抓取最后一个已知位置。 您还可以通过检查位置对象上的时间戳来检查位置最近是否更新。
您可能还需要设置一个状态标志,指示应用应在首次使用位置管理器时等待位置更新。 当您第一次启动位置管理器时,您无法真正知道该位置的最新程度。 但是,一旦经理开始更新代理,您就可以合理地确定location
经理拥有相当最新的位置。