我们可以在AppDelegate中实例化核心数据的单个对象并在整个应用程序中使用它吗?

问题描述 投票:0回答:1

我想在应用程序启动时在AppDelegate中实例化一个CoreData对象,每当我想从任何Controller保存数据时,我将使用该对象,保存它并使用相同的对象来获取数据。它在申请中有不良影响吗?

objective-c core-data
1个回答
0
投票

您当然可以从应用程序的不同部分获取相同的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”这个名称。 :)

© www.soinside.com 2019 - 2024. All rights reserved.