传递managedObjectContext - 这有效吗?

时间:2011-09-21 14:43:19

标签: iphone core-data nsmanagedobjectcontext

我有一个正在处理的应用程序。有一个导航控制器,我的appDelegate将其managedObjectContext传递给nav控制器根控制器,如下所示:

RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
rootViewController.managedObjectContext = self.managedObjectContext;

(奖金问题 - 我已经阅读了以上是传递上下文的首选方法,而不是我看到视图控制器从代理中获取上下文的一些示例 - 这是正确的吗?还有,做我需要在上面发布rootViewController,或者我是否正确,它是自动释放的,因为它不是使用alloc或new创建的?)

无论如何,应用程序的主视图有一个按钮 - 单击时,它会记录时间戳并将其保存在核心数据中。然后,应用程序显示第二个视图,即用户将使用数据子集的位置。第二个视图允许用户选择查看当前周,月或年的所有时间戳。

我最初的想法是将managedObjectContext从rootVC传递给detailVC,并在detailVC中执行数据读取和查询。这是解决这个问题的正确方法,还是在rootVC上执行查询并将数据作为数组或其他内容传递给详细控制器更好?或者除了组织上没有任何区别(没有性能差异) - 一个中的6个,另外一个中的六个?

3 个答案:

答案 0 :(得分:4)

你真的不必担心它的效率,无论你采用哪种方式它都会表现得很好 - 你只是传递一个指针。这并不是说这是一种很好的方式来处理事情。

Apple's Core Data templates are pretty terrible。一般来说,最好将数据管理分解为一个负责管理数据的单独管理器类。

答案 1 :(得分:2)

我认为,正如您在问题中所说,将MOC传递给您的视图控制器是一种很好的方法。 MVC模式背后的想法是视图控制器负责业务逻辑,所以如果你传递给它MOC(它在模型的最后)你给你的第二个视图控制器执行自己的业务逻辑的能力独立于任何其他视图控制器。

相反,如果您决定在第一个视图控制器上执行查询,然后将结果传递给第二个视图控制器,最后传回第一个视图控制器,则在第二个视图控制器中发生更改,则会增加额外的复杂性。第一个视图控制器,除了在两个视图控制器之间添加双向链接(因此一个VC中的任何更改都需要更改另一个!)最后,您将第二个视图控制器基本上减少到具有某些功能但没有模型交互的视图。

最后,您可以按照另一篇文章的建议使用一个负责所有MOC交互的单例。但在我看来,这种方法是在现有管理层之上添加一个额外的管理层,由MOC代表。当你想要摆脱视图控制器中的所有业务逻辑时,这种方法是有意义的,但是当需要由多个视图控制器共享许多复杂的活动时,通常需要这样做:但在这种情况下,可能是时候考虑了关于你的应用程序的不同组织。

最后我回答你的奖金问题:你不需要释放视图控制器,不要那样做!在它位于导航控制器内并且您没有释放导航控制器之前,您的视图控制器将被保护以免被解除分类。

答案 2 :(得分:1)

我发现绕过托管对象上下文(MOC)有点痛苦。特别是如果你需要在许多不同的地方访问它,你知道会怀疑

通常,我所做的是创建一个类来处理各种Core Data位和bobs。我使这个单身人士可以通过一次通话随时随地访问。然后我调用该方法来获取MOC。例如:

myMOC = [[MyPersistentStoreController sharedMyPersistentStoreController] managedObjectContext]];

有关如何轻松创建单身人士的信息,请查看Matt Gallagher's blog.