iOS:当我尝试通过点击获取 CLLocation 时,大多数时候会有 "big" 滞后
iOS: When I try to get CLLocation by click, there is most of the time a "big" lag
我第一次使用 CoreLocation 框架。我有一个 table,通过单击按钮应该添加一个新位置,并且应该始终显示和更新到 table 中所有条目的距离。这就是为什么我有一个 BOOL saveNewLocation,它在单击按钮时设置为 Yes。因为更新需要始终在后台进行,但是当单击按钮时,只会添加一个新条目。
目前我的 viewDidLoad 中有这个:
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
的 属性,它 returns 用户最后已知的位置(如果您从未在应用程序)。
与其等待 LocationManager 更新,不如获取用户最后已知的位置:
- (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,在这种情况下,您将不得不等待 locationManager 更新。但除此之外,您可以只获取最后已知的位置。您还可以通过检查位置对象上的时间戳来检查该位置最近是否更新。
您可能还想设置一个状态标志,指示应用程序应该在首次使用位置管理器时等待位置更新。当您第一次启动 LocationManager 时,您无法真正了解该位置的最新信息。但是一旦管理器开始更新委托,您就可以合理地确定 location
管理器拥有一个相当最新的位置。
我第一次使用 CoreLocation 框架。我有一个 table,通过单击按钮应该添加一个新位置,并且应该始终显示和更新到 table 中所有条目的距离。这就是为什么我有一个 BOOL saveNewLocation,它在单击按钮时设置为 Yes。因为更新需要始终在后台进行,但是当单击按钮时,只会添加一个新条目。
目前我的 viewDidLoad 中有这个:
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
的 属性,它 returns 用户最后已知的位置(如果您从未在应用程序)。
与其等待 LocationManager 更新,不如获取用户最后已知的位置:
- (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,在这种情况下,您将不得不等待 locationManager 更新。但除此之外,您可以只获取最后已知的位置。您还可以通过检查位置对象上的时间戳来检查该位置最近是否更新。
您可能还想设置一个状态标志,指示应用程序应该在首次使用位置管理器时等待位置更新。当您第一次启动 LocationManager 时,您无法真正了解该位置的最新信息。但是一旦管理器开始更新委托,您就可以合理地确定 location
管理器拥有一个相当最新的位置。