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 管理器拥有一个相当最新的位置。