2011-03-15 2 views
1

Je tente de charger deux singletons de style standard: http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html lorsque mon application iPhone est chargée. Voici mon code:Chargement de 2 singletons avec dépendances lorsqu'une application est ouverte (appDelegate/appDidBecomeActive) iPhone SDK


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

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

Mon "module de caméra" a un code qui vérifie une propriété du singleton AppState. Mais je pense que ce qui se passe est une condition de concurrence où le module de caméra singleton tente d'accéder à la propriété AppState alors qu'il est en train d'être initialisé (donc la propriété est nulle, et il réinitialise AppState). J'aimerais vraiment les séparer, au lieu de simplement en lancer un (ou les deux) dans le délégué de l'application. Est-ce que quelqu'un d'autre a vu quelque chose comme ça? Quel genre de solution de contournement avez-vous utilisé, ou que suggéreriez-vous?

Merci d'avance!

est ici la méthode 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]; 
    } 
    } 
} 

La ligne qui appelle AppState à CameraModule:


- (void)initCamera { 
    ... 

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

A quoi ressemble votre code 'loadState'? À moins que vous ne travailliez intentionnellement sur des threads d'arrière-plan, cette méthode ne sera pas retournée tant qu'elle ne sera pas terminée. – kubi

+0

Salut, merci pour l'aide - Je viens d'ajouter la méthode loadState à la question. – taber

+0

Qu'est ce que 'sharedAppState'? Pouvez-vous poster le code à partir de CameraModule où vous accédez à la propriété 'Appstate'? – kubi

Répondre

0

La chose la plus étrange qui se passait ... J'accédait à une propriété de AppState dans mon RootViewController, et l'ordre de l'exécution de l'application était le coupable.

RootViewController est chargé dans mon fichier MainWindow.xib, et apparemment le XIB loading/shenanegans arrive AVANT tout dans applicationDidFinishLaunching alors loadState a été appelé en fin de partie.

La solution consistait à déplacer [AppState loadState] vers la méthode init RootViewController.

Questions connexes