我们可以在AppDelegate中实例化核心数据的单个对象并在整个应用程序中使用它吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们可以在AppDelegate中实例化核心数据的单个对象并在整个应用程序中使用它吗?相关的知识,希望对你有一定的参考价值。
我想在应用程序启动时在AppDelegate中实例化一个CoreData对象,每当我想从任何Controller保存数据时,我将使用该对象,保存它并使用相同的对象来获取数据。它在申请中有不良影响吗?
您当然可以从应用程序的不同部分获取相同的CoreData托管对象,进行编辑并保存。请注意,您不能跨线程传递该托管对象。此外,您应该使用performBlock:或performBlockAndWait:从MOC(托管对象上下文)的队列中保存它。
话虽如此,我强烈建议你自己写一个名为CoreDataController的类(从NSObject派生,就是全部)。让所有CoreData方法都存在,并且不要将托管对象(您的CoreData对象)暴露在此类之外。数据可以转移到非托管对象,然后传回给应用程序的其余部分。因此,任何托管对象的获取,访问,编辑,删除和保存都只能在您的CoreDataController中完成,并且总是通过调用performBlock:或performBlockAndWait:在MOC的队列中完成。这会让你免于麻烦! :)
- (NSError*) createOrUpdateMyCoreDataGlobal:(NSString*)myData
{
__block NSError* error = nil;
[backgroundMOC performBlockAndWait:
^{
NSError* fetchError;
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"MyCoreDataGlobalObject"];
NSArray* globals = [backgroundMOC executeFetchRequest:request error:&fetchError];
MyCoreDataGlobalObject* global;
if ([globals count] >= 1)
{
global = [globals firstObject];
// you'll probably want to assert if you had more than one global, btw.
}
else if ([globals count] == 0)
{
global = [NSEntityDescription insertNewObjectForEntityForName:@"MyCoreDataGlobalObject" inManagedObjectContext:backgroundMOC];
}
// now set whatever fields you need to set in your managed global object. Maybe from parameters of this method?
global.myData = myData;
// now save your managed object
[backgroundMOC save:&error];
}];
return error;
}
这只是一个示例方法。考虑到你可能不希望从主线程调用它,因为它会阻止它直到方法完成保存到CoreData。因此,要么将其更改为返回void并切换到performBlock:或从其他队列/线程调用它。我并不建议在生产代码中使用“MyCoreDataGlobal”这个名称。 :)
以上是关于我们可以在AppDelegate中实例化核心数据的单个对象并在整个应用程序中使用它吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在我的 appdelegate applicationDidFinishLaunching 中插入 UINavigationController 并在我的笔尖实例化的 UITabBarContr
在 AppDelegate 中实例化初始 UIViewController
Swift - 在 AppDelegate 中实例化视图控制器
如何从 AppDelegate 实例化 UIViewController?