在核心数据中使用UIManagedDocument的标准(或正确)方法是什么?

时间:2014-05-02 13:19:55

标签: ios objective-c core-data uimanageddocument cs193p

我正在通过Standford CS193P学习iOS,我遇到了核心数据部分的问题。

我正在尝试使用核心数据构建应用程序,我为AppDelegate创建了一个类别(我将在didFinishLaunchingWithOptions中创建一个UIManagedDocument),此类实现一个方法来创建UIManagedDocument并将其返回给AppDelegate,这样我可以调用self.managedDocument = [self createUIManagedDocument]来获取一个:

- (UIManagedDocument *)createUIManagedDocument
{

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
    NSURL *url = [documentsDirectory URLByAppendingPathComponent:APP_NAME];
    UIManagedDocument *managedDocument = [[UIManagedDocument alloc] initWithFileURL:url];

    if ([[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
        // If the file exists, open it
        NSLog(@"File exists, not opening...");
        [managedDocument openWithCompletionHandler:^(BOOL success) {
            NSLog(@"File opened.");
        }];
    } else {
        // If the file not exists, create it
        NSLog(@"File not exists, now creating...");
        [managedDocument saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            // If the file create succesfully, open it
            [managedDocument openWithCompletionHandler:^(BOOL success) {
                NSLog(@"File opened.");
            }];
        }];
    }
    return managedDocument;
}

创建UIManagedDocument后,我试图使用以下命令将此UIManagedDocument传递给我的视图控制器:

RootViewController *rootViewController = (RootViewController *)self.window.rootViewController;
rootViewController.managedDocument = self.managedDocument;

问题出现了,我无法在视图控制器中打开UIManagedDocument。我搜索了整整一天并得到了答案:我试图在异步时同时打开它两次,处理IO请求需要时间。有一些方法,其中大多数使用Singleton。

这是我的问题:

  1. 我可以使用上述方法吗?
  2. 如果不是,在我的应用程序周围创建和传递此UIManagedDocument的标准(或正确)方法是什么?
  3. 我应该将此UIManagedDocument中的NSManagedObjectContext传递给我的视图控制器而不是传递UIManagedDocument吗?
  4. 感谢您审核我的问题。

1 个答案:

答案 0 :(得分:1)

在课程中,我们被告知使用通知进行此操作,他在51:20的第13讲的演示中解释了这一点。