Я пытаюсь загрузить два стандартных синглета: 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) {
...
}
}