我已经按照斯坦福大学的课程,现在在所有视图控制器中我基本上都使用这些设置功能:
- (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)setBudgetDatabase:(UIManagedDocument *)budgetDatabase
{
if(_budgetDatabase != budgetDatabase){
_budgetDatabase = budgetDatabase;
[self useDocument];
}
}
我现在已经看到了几个示例项目,他们在appdelegate.m初始化整个coredata的东西(到目前为止我几乎不能使用,我必须承认)并且想知道我在Standford课程中学到的方法是否正确?或者如果我误解了?我应该在app delegate中进行此设置吗?你知道一个解释这个的教程吗?对于更大的应用程序,我还没有找到解释这个的东西......
答案 0 :(得分:1)
由于 rmonjo 建议与NSFetchedResultsController
相关的内容应保留在控制器类中。例如,它可以保留在特定的UIViewController
类,UITableViewController
类或其他类可以扩展的类中(即基类UIViewController
类)。
关于与设置和加载相关的代码,我通常将该代码留在app委托中,或者我创建一个特定的单例类(只是从NSObject
扩展),可以在任何地方访问。
您可以在NSScreencast Core Data Basics看到有用的方法。显然,这种方法可以根据您的需求进行定制。
希望它有所帮助。