0

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

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

在应用程序委托中,我创建了此类的一个实例,并将委托托管上下文与 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 类中定义的这些特定操作的正确方法吗?

如果这不是正确的方法,那么为了视图控制器,我应该如何与 CoreData 模型进行交互?

如果它是正确的,那么我如何访问我在应用程序委托中声明的对象dbConnector?显然我不想创建 dbInterface 类的 6 个副本。这存在使用过多内存的问题,然后还必须编写此行的 6 个副本:

dbConnector.managedObjectContext=self.managedObjectContext;

我听说过单身这个词,这是要走的路吗?

4

1 回答 1

1

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

#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/

于 2013-02-07T19:52:08.113 回答