Как объект A ожидает, пока объект B завершит получение данных о местоположении в своем основном делегате местоположения, чтобы он мог использовать данные?

#cocoa-touch #ios #core-location

#cocoa-touch #iOS #core-location

Вопрос:

  • Объект A вызывает объект B для запуска основного местоположения и получения данных о местоположении.
  • Объект B также является основным делегатом местоположения и получает успешный обратный вызов, данные получены.
  • Делегат объекта B останавливает основное местоположение, поскольку требуется только одна точка данных о местоположении.

  • Объект A хочет использовать эти данные о местоположении и имеет доступ к переменным местоположения в объекте B

Проблема в том, что объект A пытается использовать эти пустые переменные до того, как объект B получит данные о местоположении ядра. Объект A продолжает работать, данные о базовом местоположении объекта B пока недоступны.

Как объект A эффективно «ожидает» или получает уведомление о том, что данные есть и все в порядке для продолжения?

Спасибо, Ric

Ответ №1:

Простой способ, NSNotificationCenter.

В заголовочном файле объекта B.:

 extern NSString *const kLocationKey;
extern NSString *const kIGotLocationNotification; // whatever name you like
  

В файле реализации объекта B.:

 // assign a string we will use for the notification center
NSString *const kIGotLocationNotification = @"Any text you like here";
NSString *const kLocationKey = @"Location";


// in the method where you stop core location
CLLocation *loc;

// create a dictionary object with the location info
NSDictionary *dict = [NSDictionary dictionaryWithObject:loc forKey:kLocationKey];

// you post a notification to the default center
[[NSNotificationCenter defaultCenter] postNotificationName:kIGotLocationNotification object:self userInfo:dict];
  

В файле реализации объекта A:

 // inside your init method 
// become an observer with the default center
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleIGotLocation:) name:kIGotLocationNotification object:nil];

// inside your dealloc
// don't forget to remove yourself from the notification default center
[[NSNotificationCenter defaultCenter] removeObserver:self];


// create the selector that will receive the notification
- (void)handleIGotLocation:(NSNotification *)pNotification {
    NSLog(@"Name: %@", [pNotification name]);
    NSLog(@"Object: %@", [pNotification object]);

    // the user info is going to contain the dict with your location
    NSLog(@"UserInfo: %@", [pNotification userInfo]);
}
  

Комментарии:

1. Идея использования NSNotificationCenter работает, если у меня есть код объекта A, являющийся контроллером представления, где он останавливается в цикле запуска системы. На самом деле я поместил код объекта A в applicationDidFinishLaunching делегата приложения, но проблема в том, что он не останавливается, он продолжает выполняться до конца метода. Нет возможности дождаться уведомления. Мне придется переосмыслить, откуда работает код объекта A.

2. Вы меня потеряли. Какой метод запускает end? Опубликуйте метод, о котором вы говорите в своем вопросе.

3. Ну, код, который хочет использовать данные Loc, находится в AppDidFinishLaunching . Этот метод code никого не ожидает, он будет выполняться до конца (метода). Нет способа остановить и дождаться, пока данные о местоположении станут доступны там. Я должен переосмыслить, где запрашивается этот код основного местоположения.

4. Нет, вы не хотите ждать в AppDidFinishLaunching. Как вы сказали, вам придется пересмотреть свой код основного местоположения. Возможно, используйте флаг, чтобы указать, что у вас есть местоположение. И любой код, требующий location, может проверить флаг, чтобы увидеть, соответствует ли он YES.