目前我已经创建了一个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;
我听说过单身人士这个词,这是怎么回事?
答案 0 :(得分:1)
您应该能够从应用委托中引用您的课程实例。这是我用来从另一个类引用我的app delegate的代码。您必须将您的班级前缀更改为您使用的任何内容。
#import "NXAppDelegate.h"
NXAppDelegate *appDelegate = (NXAppDelegate *)[[UIApplication sharedApplication] delegate];
由于您将dbConnector用作属性,因此可以从应用程序委托中引用它(如下所示):
viewController.managedObjectContext = appDelegate.dbConnector.managedObjectContext;
使用单身人士对iOS开发有点不满意。它倾向于过度使用或使用而不需要。如果您已经评估了条件并且无法使用委托,协议或子类来满足您的需求,我建议使用单例。
如果您想阅读有关该主题的内容,Apple似乎已更新了他们的文档,以帮助解释单身人士的正确用法。
此外,网上有很多文章可以讨论单身人士的利弊。
http://jason.agostoni.net/2012/01/22/ios-best-practices-singletons/