gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:59:03 24 4
gpt4 key购买 nike

我有一个具有不同 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com