2011-09-21 58 views
1

我有一个应用程序,我正在努力。有导航控制器,并且我的appDelegate正在经过其managedObjectContext到的资产净值控制器根控制器像这样:传递managedObjectContext - 这是否有效?

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

(奖金的问题 - 我已阅读上述内容是通过上下文中的优选方式,如相反的一些例子,我看到视图控制器从委托获取上下文的位置 - 这是正确的吗?另外,我需要释放上面的rootViewController,还是我正确的是它是自动释放的,因为它不是使用alloc或new创建的? )

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

我最初的想法是将managedObjectContext从rootVC传递给detailVC,并在detailVC中执行数据读取和查询。这是正确的方式去做这件事,或者更好地在rootVC执行查询并将数据作为数组或东西传递给细节控制器?或者除组织之外没有任何区别(没有表现差异) - 其中一个是六个,另一个是六个?

回答

4

你不必担心这种效率,它会执行很好的方式 - 你只是通过一个指针。这并不是说这是一个很好的方式去做事情。

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

+0

所以,数据管理类将包含所有核心数据的东西(managedobjectcontext等)? VC如何获取他们的数据,将查询传递给管理类并接收数组或类似数据?你知道我在哪里可以看到一个使用这种架构的示例项目吗? – Jim

+0

哇,我怎么错过你发布的链接?这是一个很好的例子,谢谢 – Jim

1

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

通常,我所做的是创建一个类来处理各种核心数据位和bobs。我把这个单身人士用一个电话随时随地存取。然后我调用这个方法来获得MOC。例如:

myMOC = [[MyPersistentStoreController sharedMyPersistentStoreController] managedObjectContext]]; 

有关如何轻松创建一个单独的信息,看看Matt Gallagher's blog.

+0

+1链接到马特的单身职位 - 谢谢 – Jim

2

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

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

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

最后我回答你的奖金问题:你不需要释放视图控制器,不要这样做!直到它位于导航控制器内部并且您没有释放导航控制器时,您的视图控制器才不会被解除分配。

+0

+1 - 最后,我决定单身解决方案更适合我的特定项目,但我发现你的回答很有见地。它绝对看起来最好的解决方案取决于你正在工作的应用程序有多复杂。感谢这篇文章 – Jim