为什么启用XCode Core Data的Core Data堆栈被视为私有?

时间:2010-05-07 15:56:16

标签: iphone objective-c cocoa xcode core-data

关于启用了CoreData的XCode模板,我已阅读unclear use of @property in window app using core data,其中包含模板中的“内容”。但我对'为什么'有疑问。通过在实现文件中声明类别,CoreData访问器就像私有方法一样。问题在于,只要您想在应用程序的其他位置使用CoreData,就需要一些额外的代码。

我认为您需要提供自己的方法来公开托管对象上下文,例如......

- (NSManagedObjectContext *)getManagedObjectContext
{
    return self.managedObjectContext;
}

...这将允许您的应用的其他部分使用它。

或者您需要使用特定方法阻塞应用程序委托以返回托管对象,即getProducts或setUser。

有人能说清楚这里的推理吗?

2 个答案:

答案 0 :(得分:4)

之所以这样,是因为您应该在设计中使用依赖注入。这是Core Data团队推荐的设计。预期的是,您的应用程序委托将在根视图控制器中设置NSManagedObjectContext引用。从那里,控制器将在以下视图控制器中设置或注入必要的依赖项。

这将导致更灵活的设计。我在关于MDN的文章(http://www.mac-developer-network.com/articles/cd0004.html)中深入讨论了这个问题。

答案 1 :(得分:1)

如果您的项目很大并且需要从AppDelegate外部访问托管对象上下文, 我只是将managedObjectContext的属性声明移动到头文件中,如:

@interface myAppDelegate : NSObject <UIApplicationDelegate> {
    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;       
    NSPersistentStoreCoordinator *persistentStoreCoordinator;
}
@property (retain,nonatomic) NSManagedObjectContext*managedObjectContext;
@end

然后,应用的其他部分可以使用appDelegate.managedObjectContext。 但是,没有理由在应用代表之外公开managedObjectModelpersistentStoreCoordinator

顺便提一下,我对你对Objective-C的使用有一些评论:

请勿在吸气剂前使用get。对于名为foo的属性,getter应为

-(Foo*)foo;

并且setter应该是

-(void)setFoo:(Foo*)_foo;

按照惯例,当指针作为方法参数提供时使用get...,如-[NSString getCharacters:range:]中所示(参见Apple doc)。

遵循谚语,在罗马时,像罗马人那样做。