iOS:当我尝试通过单击获取CLLocation时,大多数时候会"big"滞后



我首先使用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经理拥有相当最新的位置。

相关内容

最新更新