Как получить текущую координату CLLocationManager - PullRequest
0 голосов
/ 10 июня 2018

У меня есть UIViewController, где я хочу отобразить карту с центром в текущей позиции.

Метод didFinishLaunchingWithOptions * в AppDelegate выглядит следующим образом:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.locationManager = [[CLLocationManager alloc] init];

    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestAlwaysAuthorization];
    }
    [self.locationManager startUpdatingLocation];

    return YES;
}

Мой * 1008Класс * UIViewController.m выглядит следующим образом:

@interface GMapViewController ()<CLLocationManagerDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) CLLocation *currentLocation;

@end

@implementation GMapViewController

#pragma mark - Lifecycle methods

- (void)viewDidLoad {
    [super viewDidLoad];

    self.currentLocation = [CLLocation new];

    [[[AppDelegate appDelegate] locationManager] setDelegate:self];

    MKCoordinateRegion visibleRegion;
    visibleRegion.center = self.currentLocation.coordinate;
    visibleRegion.span = MKCoordinateSpanMake(200, 200);

    [self.mapView setRegion:visibleRegion animated:YES];
}

#pragma mark - CLLocationManagerDelegate's methods

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    self.currentLocation = [locations lastObject];
}

Дело в том, что didUpdateLocations метод делегата CLLocationManager вызывается слишком поздно, так как свойство currentLocation имеетнет значения при вызове viewDidLoad .

Как получить текущую координату до вызова viewDidLoad ?

1 Ответ

0 голосов
/ 11 июня 2018

Вам нужно обновить вид карты после обновления местоположения;это займет некоторое время.

У вас также есть потенциальное состояние гонки, потому что вы вызываете startUpdatingLocation в своем AppDelegate, но контроллер представления не устанавливается в качестве делегата до viewDidLoad.Делегат почти наверняка будет установлен до того, как будет обновлено местоположение, но вы не можете гарантировать это.

Я бы посоветовал вам переместить все в контроллер представления и, если вы хотите обновить карту только один раз, используйтеrequestLocation:

@interface GMapViewController ()<CLLocationManagerDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) CLLocation *currentLocation;
@property (strong, nonatomic) CLLocationManager *locationManager;

@end

@implementation GMapViewController

#pragma mark - Lifecycle methods

- (void)viewDidLoad {
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];
    self.currentLocation = nil;

        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
            [self.locationManager requestAlwaysAuthorization];
        } else {
            [self.locationManager requestLocation];
}

-(void) setMapTo:(CLLocation *)location {
      MKCoordinateRegion visibleRegion;
      visibleRegion.center =location.coordinate;
      visibleRegion.span = MKCoordinateSpanMake(200, 200);

     [self.mapView setRegion:visibleRegion animated:YES];
}

#pragma mark - CLLocationManagerDelegate's methods

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    CLLocation *currentLocation = [locations lastObject];
    dispatch_async(dispatch_get_main_queue(), ^{
          [self setMapTo:currentLocation];
    });
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if (status != kCLAuthorizationStatusRestricted && status != kCLAuthorizationStatusDenied) {
        [manager requestLocation];
    }
}

Если вы просто хотите, чтобы карта постоянно отслеживала местоположение пользователя, тогда вы можете просто установить свойство userTrackingMode вида карты на MKUserTrackingModeFollow

...