我已经完成了斯坦福大学的类(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
的许多异步代码所代替。
您如何处理迁移?当迁移需要轻量级迁移之外的额外工作时,会发生什么情况?
很多事情要考虑。
我书中的第一位是随机和异步保存。我只是不喜欢放弃控制权的想法。