9

建立一个将使用核心数据模型的应用程序。我非常熟悉Objective C,而我通常的设计模式并不适用于Core Data和Objective C,至少我似乎无法找到证实它们的例子。核心数据iPhone应用程序的设计模式

我已经通过苹果开发人员的例子和interrtubes上的不同来源。

看来,利用核心数据我需要通过managedObjectContext给我的每一个viewControllers的,拥有的viewController实施NSFetchedResultsControllerDelegate然后实现每做一个获取并随后实施方法

NSFetchedResultsChangeInsert 

NSFetchedResultsChangeDelete NSFetchedResultsChangeMove NSFetchedResultsChangeUpdate

这增加了在每个的viewController的代码约100+线,它是90%相同的代码我连连写。另外,我必须通过一切,并跟踪它的内存占用情况。

在其他语言中,我将构建一些类的单例模型,该类包含根据请求维护和传递数据的方法,可以从任何地方获得。看来我不能在Objective C中采用这种方法。如果我在哪里构建一个采用managedObjectContext的静态类并返回了我需要的内容,我仍然必须将managedObjectContext传递给每个视图,而且它不会是异步,就像当我实现委托方法,当结果准备好时被调用。

我希望这是有道理的,有人可以确认没有其他合理的方法来做到这一点,或帮助指向我以一种好方式包装这个方向。

谢谢:)

+0

在这里提出了一个类似的问题,这可能也有帮助:http://stackoverflow.com/questions/1267520/where-to-place-the-core-data-stack-in-a-cocoa-cocoa- touch-application – 2009-10-24 21:03:23

回答

19

核心数据并不像您描述的那么复杂。

通常,iPhone应用程序具有一个“主”管理对象上下文,该上下文通常由应用程序代理拥有。只要您可以获得应用程序委托(提示:[[UIApplication sharedApplication] delegate]),您就可以访问受管对象上下文。我喜欢定义一个静态全局变量来保存对我的应用程序委托的引用,以使生活更轻松。

NSFetchedResultsController实例和UITableView实例之间通常存在一对一的对应关系。除填充表格视图外,您需要NSFetchedResultsController的情况极为罕见。如果您有许多相似的视图(例如,标签栏可让您以不同的方式查看相同的数据,那么您应该创建一个基类来配置NSFetchedResultsController并派生出特定的视图控制器从那。

现在,当您创建视图控制器来编辑对象时,在单独的托管对象上下文中执行此操作通常是一个好主意。如果用户取消,则只需放弃上下文,更改将消失。再一次,你并不需要NSFetchedResultsController,因为这些视图只涉及单个对象。

当您完成编辑时,您的受管对象上下文为​​。管理其他托管对象上下文的对象应实现NSFetchedResultsControllerDelegate方法以保持表视图同步。同样,这可以在基类中实现,因此您可以将相关视图控制器的此功能概括为一个。

+0

请问,你能提供一个这个基类应该如何的样本吗? – Esteve 2014-02-26 09:47:53

0

你绝对不得不使用CoreData模型,或者使用NSCoder(NSArchiver,NSKeyedArchiver等)工作吗?我发现CoreData对于大多数应用程序来说都是过度的。

另外,你能澄清为什么你不能采取单身的方法?我在许多应用程序中使用了单身工厂,没有问题。定义在共享(单例)实例上运行的类级方法相当容易。

+0

亚历克斯你是对的:)我已经吹捧了resultsController有点超出比例,因为我有3个tableviews链接在一起,在所有其他视图resultsController将是毫无意义的。 因此,使用通过[UIApplication sharedApplication]委托]在我的应用程序委托中实例化的managedObjectContext对象是要走的路,这很有道理,有点像单例。 D Carney,我将会维护一个相当大的模型,它将与一个暴露模型的Web服务同步(我的数据的本地和全局版本),所以我觉得核心数据就是这个东西。 – RickiG 2009-10-24 19:48:03

+0

林不知道单例方法不会工作,但如果数据未准备好或无法保存,我可能会得到计时问题。 谢谢你们两位,我觉得我对ManagedObjectContexts和Core Data的替代方法有了更清晰的了解:) – RickiG 2009-10-24 19:53:11

+0

在单例实例上运行的方法是通过实例方法而不是类方法。 – 2009-10-25 14:37:52

相关问题