我想在应用程序启动时在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”这个名称。 :)