然而,我的初步倾向是将此代码移至其自己的类中,该类负责处理Core Data Stack的管理。
你通常会将此功能封装在自己的类中,还是将其保留在App Delegate中?
[[UIApplication delegate] managedObjectContext];
我有一个单例类,用于管理核心数据,而不是将其留在应用程序委托中。我不想在应用程序委托类中添加可能需要的方法,如获取特定对象等,以免使它变得混乱。
我将核心数据逻辑留在App delegate中,原因如下:
1)我没有看到将此代码移动到其他类中的任何真正优势:代理的概念通过由App delegate处理核心数据逻辑已经完美实现,因为核心数据模型实际上是应用程序的基本部分;
2)在我所见过的所有示例代码中,包括Apple的示例代码,核心数据都由App delegate处理;
3)即使在Core Data书籍中,让App delegate处理与核心数据相关的代码也是常见做法;
4)就个人而言,我并不认为使用专门的类来处理核心数据会提高可读性或其他方面的优点,但这是一种个人喜好,我不会在这里争论哪种方法是最佳的。对我来说,保持功能的同时保持简单很重要。
在你的情况下,我会问自己一个问题:“Core Data堆栈归属于谁?”数据本身确实是应用程序的范畴,不是吗?(参见Mac上的Core Data,在那里您可能拥有能够同时使用多个文档的应用程序,因此Core Data堆栈属于每个文档。)
在任何Cocoa/Cocoa Touch应用程序中,应用委托通常是自定义应用程序行为的首选方法,因此这是Core Data堆栈的自然位置。
现在,我怀疑你遇到的问题是经常写诸如以下内容感觉不对:
NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
在这种情况下,我通常会编写如下所示的函数(而不是方法):
NSManagedObjectContext *UIAppManagedObjectContext() {
return [*(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
我为 NSPersistentStoreCoordinator
和 NSManagedObjectModel
编写了类似的函数。 我把它们都放在应用程序委托的.h/.m文件中,因为这些也是应用程序级别的对象。
我会在新答案中列出这个问题的解决方法。(我放弃了以前的FJSCoreDataStack类,采用了新的方法)
我的新方法是在NSManagedObjectContext上使用一个分类。我添加了以下类方法:
+ (NSManagedObjectContext *)defaultManagedObjectContext;
+ (NSManagedObjectContext *)scratchpadManagedObjectContext;
+ (NSManagedObjectModel *)managedObjectModel;
+ (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
+ (NSString *)applicationDocumentsDirectory;
我赞成将应用程序委托知道模型从哪里开始,并且让模型知道托管对象上下文在哪里。对于我来说,模型的Core Data-"ness"似乎是模型的实现细节,控制器类(如应用程序委托)应该只询问“给我关于模型的这些信息”,而模型应该知道如何回答这个问题。因此,通过控制器对象可用的Core Data对象似乎是一个泄漏的抽象。
UIViewControllers
不应该涉及到NSManagedObjectContext
,它们只需要与模型交互并请求所需的内容即可。获取信息的机制对于我的视图控制器来说并不重要。 - kubi