我已经完成了斯坦福大学的类(class),并按照讲座中的步骤设置了我的第一个应用程序和核心数据。大约是这样(我现在将代码转移到应用程序委托(delegate)中):

- (void)setupFetchedResultsController
{
    NSError *error = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"MainCategory"];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"position" ascending:YES]];
    [self.budgetDatabase.managedObjectContext executeFetchRequest:request error:&error];

    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request
                                                                       managedObjectContext:self.budgetDatabase.managedObjectContext
                                                                         sectionNameKeyPath:nil
                                                                                  cacheName:nil];
}

-(void)useDocument
{
    if(![[NSFileManager defaultManager]fileExistsAtPath:[self.budgetDatabase.fileURL path]]){
        [self.budgetDatabase saveToURL:self.budgetDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            [self setupFetchedResultsController];
        }];
    } else if (self.budgetDatabase.documentState == UIDocumentStateClosed){
        [self.budgetDatabase openWithCompletionHandler:^(BOOL success){
            [self setupFetchedResultsController];
        }];
    } else if (self.budgetDatabase.documentState == UIDocumentStateNormal){
        [self setupFetchedResultsController];
    }
}

- (void)viewWillAppear:(BOOL)animated
{
    //Initialize database
    [super viewWillAppear:animated];
    if(!self.budgetDatabase){
        NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentationDirectory inDomains:NSUserDomainMask] lastObject];
        [url URLByAppendingPathComponent:@"BudgetDatabase"];
        self.budgetDatabase = [[UIManagedDocument alloc]initWithFileURL:url];
    }
}

Apple模板中的代码(如果在创建Xcode项目时选中“CoreData”,则看起来非常不同且更加复杂)。这个UIManagedDocument有什么区别?有更好还是更坏?

最佳答案

UIManagedDocument设计用于具有文档(因此具有名称)的应用程序。斯坦福大学的类(class)正使用它跳过核心数据的构建,以使其对学生“更轻松”。不幸的是,从长远来看,它们使您的生活更加艰难。

不要使用UIManagedDocument。从Apple模板开始,了解如何站立核心数据堆栈。这样一来,您将获得更多的知识,对代码的工作有更好的了解(更少的魔力),并会以开发人员的身份发展。
UIManagedDocument具有很多优势,当事情开始变得复杂时,很难使用。跳过它。

更新
UIManagedDocument并非设计为用于应用程序的单个Core Data堆栈,而是用于基于文档的应用程序。

您不能保证保存(不对它进行黑客攻击)的事实是一个很大的风险。它也是一个不透明的构造,您不应该深入了解它的私有(private)上下文。

它会自行保存而无法停止的事实使它在我的书中变得很危险。想要不保存上下文(繁重的UI,播放视频等)非常容易,并且它决定保存。错误的UX。

最重要的是,它打算与使用复杂的外部文件结构一起使用,并且风险更大。

它为您节省了什么?没有什么。这并不是节省代码,因为用于站立普通Core Data堆栈的6行代码已被用于站立和部署UIManagedDocument的许多异步代码所代替。

您如何处理迁移?当迁移需要轻量级迁移之外的额外工作时,会发生什么情况?

很多事情要考虑。

我书中的第一位是随机和异步保存。我只是不喜欢放弃控制权的想法。

10-08 07:46