iphone - 通过 UIManagedDocument 异步打开时如何确保 NSManagedObjectContext

标签 iphone ios core-data nsmanagedobjectcontext

我有一个具有不同 Controller 的应用程序,它们都在同一个 NSManagedObjectContext 上运行。

我的方法是在我的 AppDelegate 中初始化 NSManagedObjectContext 并将其注入(inject)到所有 Controller 中。

我正在通过打开这样的 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 仅在完成 block 中可用。

如何确保 Controller 始终有一个有效的 NSManagedObjectContext 可以使用?当然,问题发生在启动时,即当 Controller 想要在他的“viewDidLoad”方法中使用 NSManagedObjectContext,并且 AppDelegate 中的完成 block 尚未运行时......

一种方法可能是在 AppDelegate 中“等待”,直到 UIDocument 打开,但据我收集 this is not recommended ...

我想避免使用处理打开 NSManagedObjectContext 的异步性质的代码“污染”我的 Controller ......但也许这是一个天真的愿望?

最佳答案

在您的 appDelegate 中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MyWaitViewController* waitController = [[MyWaitViewController new] autorelease];
    self.window.rootViewController =  waitController;

// then somewheres else, when you get your context
  [databaseDoc saveToURL:databaseDoc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        myContextController.managedObjectContext = databaseDoc.managedObjectContext;
        self.window.rootViewController    = myContextController;
        // note that at this point when the viewDidLoad method will get called
        // it will have his managedObjectContext and his view already available.
        // you can change your rootController, or push another viewController into the
 // stack. Depending on what u want from the GUI side

    }];
    return YES;
}

请注意,您将 GUI 逻辑部署到 MyWaitViewController + AppDelegate 端。但是你让你的“myContextController”远离那个逻辑控制,因为他只有在上下文存在时才会被调用/创建。

关于iphone - 通过 UIManagedDocument 异步打开时如何确保 NSManagedObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12882214/

相关文章:

iphone - 了解应用程序委托(delegate)和 View Controller 如何相互关联

iphone - 如何以编程方式从相机拍照并保存在照片库中?

IOS Segue 无法直接设置标签

ios - 从 UIButton 调用 prepareforSegue?

ios - 有什么方法可以限制核心数据中的重复条目吗?

ios - 使用 CoreData 和捆绑的 SQLite 数据库?

iphone - 如何在不离开应用程序的情况下使用 didSelectRowAtIndexPath 加载网页?

ios - NSKeyedArchiver 从 objectForKey 更改为 intForKey

ios - 无法以编程方式设置 UINavigationControllerDelegate(但可以通过 Storyboard设置)

ios - 如何在 Swift 中初始化生成的核心数据 NSManagedObject