我有一个具有不同控制器的应用程序,它们都在同一个 NSManagedObjectContext 上运行。
我的方法是在我的 AppDelegate 中初始化 NSManagedObjectContext 并将其注入到所有控制器中。
我正在通过打开这样的 UIManagedDocument 来初始化我的 NSManagedObjectContext:
UIManagedDocument* databaseDoc = [[UIManagedDocument alloc] initWithFileURL:url];
if (![[NSFileManager defaultManager] fileExistsAtPath:[databaseDoc.fileURL path]]) {
[databaseDoc saveToURL:databaseDoc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
myController.managedObjectContext = databaseDoc.managedObjectContext;
}];
} else if (databaseDoc.documentState == UIDocumentStateClosed) {
[databaseDoc openWithCompletionHandler:^(BOOL success) {
myController.managedObjectContext = databaseDoc.managedObjectContext;
}];
} else if (databaseDoc.documentState == UIDocumentStateNormal){
myController.managedObjectContext = databaseDoc.managedObjectContext;
}
现在我的问题是,打开 UIManagedDocument 是异步发生的,并且 NSManagedObjectContext 仅在完成块中可用。
如何确保控制器始终有一个有效的 NSManagedObjectContext 可以使用?当然,问题发生在启动时,即当控制器想要在他的“viewDidLoad”方法中使用 NSManagedObjectContext,并且 AppDelegate 中的完成块尚未运行时......
一种方法可能是在 AppDelegate 中“等待”直到 UIDocument 打开,但据我所知,不建议这样做......
我想避免使用处理打开 NSManagedObjectContext 的异步性质的代码“污染”我的控制器......但也许这是一个天真的愿望?