9

我正在构建一个将使用核心数据模型的应用程序。我是 Objective C 的新手,我通常的设计模式并不真正适用于 Core Data 和 Objective C,至少我似乎无法找到证实它们适用的示例。

我已经通过了 Apple Developer 示例和 intertubes 上的不同来源。

似乎要利用核心数据,我需要将 managedObjectContext 传递给我的每个 viewController,让 viewController 实现 NSFetchedResultsControllerDelegate,然后实现每个获取方法并随后实现

NSFetchedResultsChangeInsert

NSFetchedResultsChangeDelete NSFetchedResultsChangeMove NSFetchedResultsChangeUpdate

这在每个 viewController 中添加了大约 100 多行代码,这与我一次又一次编写的代码相同的 90%。另外,我必须传递所有内容并跟踪它的内存占用。

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

我希望这是有道理的,并且有人可以确认没有其他合理的方法可以做到这一点,或者帮助我指出以一种好的方式结束它的方向。

谢谢:)

4

2 回答 2

19

Core Data 并不像您描述的那么复杂。

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

NSFetchedResultsController实例和实例之间通常存在一一对应的关系UITableView。除了填充表视图之外,您需要一个NSFetchedResultsController. 如果您有许多相似的视图(例如,一个标签栏,可以让您以不同的方式查看相同的数据,就像 iPod 应用程序一样),您应该创建一个单独的基类来配置NSFetchedResultsController和派生您的特定视图控制器那。

现在,当您创建视图控制器来编辑对象时,通常最好在单独的托管对象上下文中执行此操作。如果用户取消,您只需丢弃上下文,更改就会消失。同样,您实际上并不需要NSFetchedResultsController为此,因为这些视图只涉及单个对象。

完成编辑后,您save:将获得托管对象上下文。管理其他托管对象上下文的对象应实现NSFetchedResultsControllerDelegate保持表视图同步的方法。同样,这可以在基类中实现,因此您可以将此功能推广到相关的视图控制器。

于 2009-10-24T17:29:36.537 回答
0

您是否绝对必须使用 CoreData 模型,或者使用 NSCoder(NSArchiver、NSKeyedArchiver 等)的东西会起作用吗?我发现 CoreData 对于大多数应用程序来说都是多余的。

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

于 2009-10-24T17:38:02.167 回答