代码之家  ›  专栏  ›  技术社区  ›  rob5408

为什么XCode的CoreData启用模板中的CoreData堆栈被视为私有的?

  •  1
  • rob5408  · 技术社区  · 14 年前

    关于启用CoreData的XCode模板,我已经阅读了 unclear use of @property in window app using core data 在模板中的“什么”部分。但我对“为什么”有意见。通过在实现文件中声明类别,CoreData访问器的行为类似于私有方法。问题是,每当你想在应用程序的其他地方使用CoreData时,你都需要一些额外的代码。

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

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

    或者,您需要用特定的方法阻塞打包应用程序委托,以返回托管对象,例如getProducts或setUser。

    有人能解释一下原因吗?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Marcus S. Zarra    14 年前

    这是因为您应该在设计中使用依赖注入。这是核心数据团队推荐的设计。您的应用程序代理将设置 NSManagedObjectContext 根视图控制器中的引用。从那里,控制器将在以下视图控制器中设置或注入必要的依赖项。

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

        2
  •  1
  •   Yuji    14 年前

    如果您的项目很大,需要从AppDelegate外部访问托管对象上下文, 我只想把 managedObjectContext

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

    appDelegate.managedObjectContext . 没有理由暴露 managedObjectModel persistentStoreCoordinator 但在应用程序代理之外。

    不要使用 get 在吸气剂前面。一个叫做 foo ,getter应该是

    -(Foo*)foo;
    

    而setter应该是

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

    按照惯例, get... -[NSString getCharacters:range:] (参见 Apple doc ).

    遵循这句谚语,当你在罗马的时候,做罗马人做的事。