为CoreData创建接口

时间:2013-02-07 18:03:17

标签: iphone ios objective-c xcode ios6

目前我已经创建了一个Objective-C类(NSObject)来处理我需要的任何特殊功能,这些功能涉及与我的CoreData模型的交互。这些与我的CoreData交互的函数位于dbInterface.h和dbInterface.m文件中。在dbInterface类中,我添加了一个符合<NSFetchedResultsControllerDelegate>

@interface dbInterface : NSObject<NSFetchedResultsControllerDelegate>{
    NSFetchedResultsController *fetchedResultsController;
    NSManagedObjectContext *managedObjectContext;
}

在app委托中,我创建了这个类的实例,并将委托托管上下文与dbInterface对象托管上下文相连接:

appDelegate.h:

@property (nonatomic, retain) IBOutlet dbInterface *dbConnector;

appDelegate.m:

@synthesize dbConnector;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    dbConnector.managedObjectContext=self.managedObjectContext;
    return YES;
}

问题: 我有6个视图控制器,它们必须与这个dbInterface对象进行交互,以收集视图控制器本身的数据。因此,在此设置中,dbInterface充当viewController和CoreData模型的中间人。这是执行我在中间人dbInterface类中定义的这些特定操作的正确方法吗?

如果它是 NOT 正确的方式,那么我应该如何为视图控制器与CoreData模型进行交互呢?

如果正确,那么如何访问我在app delegate dbConnector中声明的对象?显然我不想创建6个dbInterface类的副本。这有使用太多内存的问题,然后还要编写这行的6个副本:

dbConnector.managedObjectContext=self.managedObjectContext;

我听说过单身人士这个词,这是怎么回事?

1 个答案:

答案 0 :(得分:1)

您应该能够从应用委托中引用您的课程实例。这是我用来从另一个类引用我的app delegate的代码。您必须将您的班级前缀更改为您使用的任何内容。

#import "NXAppDelegate.h"
NXAppDelegate *appDelegate = (NXAppDelegate *)[[UIApplication sharedApplication] delegate];

由于您将dbConnector用作属性,因此可以从应用程序委托中引用它(如下所示):

viewController.managedObjectContext = appDelegate.dbConnector.managedObjectContext;

使用单身人士对iOS开发有点不满意。它倾向于过度使用或使用而不需要。如果您已经评估了条件并且无法使用委托,协议或子类来满足您的需求,我建议使用单例。

如果您想阅读有关该主题的内容,Apple似乎已更新了他们的文档,以帮助解释单身人士的正确用法。

http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html

此外,网上有很多文章可以讨论单身人士的利弊。

http://jason.agostoni.net/2012/01/22/ios-best-practices-singletons/