关于启用了CoreData的XCode模板,我已阅读unclear use of @property in window app using core data,其中包含模板中的“内容”。但我对'为什么'有疑问。通过在实现文件中声明类别,CoreData访问器就像私有方法一样。问题在于,只要您想在应用程序的其他位置使用CoreData,就需要一些额外的代码。
我认为您需要提供自己的方法来公开托管对象上下文,例如......
- (NSManagedObjectContext *)getManagedObjectContext
{
return self.managedObjectContext;
}
...这将允许您的应用的其他部分使用它。
或者您需要使用特定方法阻塞应用程序委托以返回托管对象,即getProducts或setUser。
有人能说清楚这里的推理吗?
答案 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
。
但是,没有理由在应用代表之外公开managedObjectModel
或persistentStoreCoordinator
。
顺便提一下,我对你对Objective-C的使用有一些评论:
请勿在吸气剂前使用get
。对于名为foo
的属性,getter应为
-(Foo*)foo;
并且setter应该是
-(void)setFoo:(Foo*)_foo;
按照惯例,当指针作为方法参数提供时使用get...
,如-[NSString getCharacters:range:]
中所示(参见Apple doc)。
遵循谚语,在罗马时,像罗马人那样做。