【问题标题】:Not sure where the core data code should go in the MVC不确定核心数据代码应该放在 MVC 中的哪个位置
【发布时间】:2014-02-24 07:12:33
【问题描述】:

在我正在开发的这个应用程序中,我使用核心数据来存储内容。我在AppDelegatedidFinishLaunchingWithOptions 方法中填充数据库。在视图控制器中,我使用NSFetchRequest 提取所需的数据。

我的问题是,与提取数据相关的代码是否应该在视图控制器中?或者我应该在为这些实体生成的NSManagedObject 子类中创建单独的方法并从视图控制器中调用它们?

有人可以解释一下吗?

谢谢。

【问题讨论】:

  • 您应该为它创建单独的模型类。您可以在其中添加各种方法来添加/更新/获取核心数据实体对象。如果多个视图控制器一次需要相同的数据,您也可以创建相同的共享实例。
  • 你的意思是另一个全新的模型类?不是NSManagedObject 子类,对吧?
  • viewController 是您通常调用 performFetch 以从 Core Data 获取实体数组(NSManagedObject 子类>)的地方。也是更新属性和/或删除对象的地方。Apple 为此提供了大量示例代码.
  • 请注意,长进程可能会阻塞主线程 - 因此在 didFinishLaunching 中填充数据库可能会导致应用程序无响应,除非您在后台线程上执行此操作。
  • @DuncanGroenewald 谢谢。数据量相当小。如果有任何性能滞后的迹象,我会将保存过程移至单独的线程。

标签: ios database core-data model-view-controller nsmanagedobject


【解决方案1】:

您应该创建一个模型类,这意味着:

@interface DataImporter : NSObject
@property(nonatomic, readonly) CoreDataManager *coreDataManager;

 - (id)initWithCoreDataManager:(CoreDataManager *)coreDataManager;

 - (void)importDataWithCompletionCallback:(void (^)())completionBlock;
@end

它不是NSManagedObject 子类,而是负责将数据导入CoreData 存储的对象。 importDataWithCompletionCallback 可以,例如创建所有必要的 NSManagendObject 对象(取决于一些 JSON)并保存它们,在后台执行,完成后调用回调块。

子类化 NSManagendObject 不是一个好方法。

【讨论】:

  • 感谢您的回复。但是我保存的数据不是来自网络服务或任何东西。它也没有改变。我担心为数据库中的实体创建的NSManagendObject 子类。如果我把方法说成是获取某个实体的对象数组,这是不好的做法吗?
  • 是的。您不应该将任何方法直接添加到子类的文件中。但是您可以为您的实体子类创建一个类别。如果您在代码中有数据,最好以某种方式将它们结构化,例如有一个DataProvider 的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多