iOS 核心数据应用程序委托?
Posted
技术标签:
【中文标题】iOS 核心数据应用程序委托?【英文标题】:iOS Core Data App Delegate? 【发布时间】:2012-05-02 19:51:55 【问题描述】:我正在开发一个需要使用 Core Data 的应用程序,但我不禁注意到,如果您使用除 Master-Detail、Utility 或 Blank 模板之外的任何内容,则必须手动输入 Core Data在 Xcode 中。
我还注意到,为了使 Core Data 正常工作,您必须将应用程序包装在 Navigation Controller 中,并将 Core Data 的代码放在 AppDelegate 文件中。
任何人都知道解决这个问题的方法,或者这是应该的方式吗?
我的 App Delegate 看起来像这样,这三行似乎是 ManagedObjectContext 最重要的设置!
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
FBBetsViewController *controller = (FBBetsViewController *)navController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
【问题讨论】:
【参考方案1】:这些模板包括一些核心数据设置,但远非强制性。您可以使用任何项目中的核心数据。如果需要,您可以直接从空应用程序中获取代码,并在您的项目中使用它。
如果查看生成的代码,您会看到用于构建核心数据堆栈的三个主要组件的三个“getter”。
managedObjectModel 使用捆绑包中的模型文件创建模型。通过 New-File 并选择 Core Data 数据模型在 Xcode 中轻松创建。
persistentStoreCoordinator 使用模型和 SQL 存储。
最后,managedObjectContext 是使用persistentStoreCoordinator 创建的。请注意,如果您愿意,您确实可以通过一种方法构建该堆栈。不需要拥有这些单独的访问器...
你可以做这样的事情......
- (NSManagedObjectContext*)setupCoreDataStack
// Load the model description
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"APPNAME" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// Prepare the persistent store coordinator - needs the model
NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"APPNAME.sqlite"];
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
// Handle the error !!!!!
// exit the function
return nil;
// Create the managed object context. This is what you will really
// use in the rest of your program.
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
return moc;
现在您的堆栈几乎与其他堆栈相同。唯一真正的区别是这里的 MOC 使用的是主队列并发类型,这是一个更好的选择。
如果您想拥有更好的性能模型,请插入父 moc。
实际上,如果您不接受当前的核心数据策略,我建议您使用 UIManagedDocument。
【讨论】:
应该这一行 - NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"APPNAME.sqlite"];是 NSURL *storeURL = [documentsDirectory...【参考方案2】:Core Data 不强制您使用导航控制器,也不强制您在 AppDelegate 中设置它。通常在启动时将设置放在 AppDelegate 中,但实际上,只要确保它只初始化一次,您就可以将其移动到任何您想要的地方。
【讨论】:
以上是关于iOS 核心数据应用程序委托?的主要内容,如果未能解决你的问题,请参考以下文章
将核心数据添加到现有的选项卡式应用程序(ios swift、Xcode6)