Загрузка двух синглетонов с зависимостями при открытии приложения (appDelegate / appDidBecomeActive) iPhone SDK - PullRequest
1 голос
/ 16 марта 2011

Я пытаюсь загрузить два стандартных синглета: http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html при загрузке приложения для iPhone. Вот мой код:


- (void) applicationDidFinishLaunching:(UIApplication *)application {  
    // first, restore user prefs
    [AppState loadState];

    // then, initialize the camera
    [[CameraModule sharedCameraModule] initCamera];
}

Мой «модуль камеры» содержит код, который проверяет свойство синглтона AppState. Но я думаю, что происходит гонка, когда синглтон модуля камеры пытается получить доступ к свойству AppState, когда он находится в процессе инициализации (поэтому свойство имеет значение nil и выполняет повторную инициализацию AppState). Я бы очень хотел оставить их отдельно, вместо того, чтобы просто бросить один (или оба) в делегат приложения. Кто-нибудь еще видел что-то подобное? Какой обходной путь вы использовали или что бы вы предложили?

Заранее спасибо!

Вот метод loadState:


+ (void)loadState {
  @synchronized([AppState class]) {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *file = [documentsDirectory stringByAppendingPathComponent:@"prefs.archive"];
    Boolean saveFileExists = [[NSFileManager defaultManager] fileExistsAtPath:file];

    if(saveFileExists) {
      sharedAppState = [[NSKeyedUnarchiver unarchiveObjectWithFile:file] retain];
    } else {
      [AppState sharedAppState];
    }
  }
}

Строка, которая вызывает AppState в CameraModule:


- (void)initCamera {
    ...

    if([AppState sharedAppState].captureSession != nil) {
        ...
    }
}

1 Ответ

0 голосов
/ 18 марта 2011

Происходила странная вещь ... Я получал доступ к свойству AppState в моем RootViewController, и виноват был порядок выполнения приложения.

RootViewController загружается в мое главное окно.xib файл, и, очевидно, загрузка / shenanegans XIB происходит ДО чего-либо внутри applicationDidFinishLaunching, поэтому loadState вызывался в конце игры.

Решением было перенести [AppState loadState] в инициал моего RootViewControllerспособ.

...