我有一个共同的应用程序模式:用户在主视图控制器中输入数据,然后在模式视图控制器中的表中查看它,其中可以删除或修改行。我一直遵循斯坦福iPhone课程的总体设计策略,但在某些地方出现了问题,我得到的是SIGABRT的例外情况,例如“非法尝试在不同背景下的对象之间建立关系”xyz“。对于这种常见的应用程序模式,有效的CoreData上下文/协调器策略是什么?
正如在斯坦福大学课程中,我使用了一个叫做“数据库”的单例类,它应该在请求时返回相同的上下文。因此,在主视图控制器在我viewDidLoad方法的第一个命令是:
dbsingleton = [Database sharedInstance];
nmocontext = [dbsingleton managedObjectContext];
nmocontext是伊娃我整个视图控制器使用。当用户想要查看其他视图控制器时,使用该表,我alloc-init它,然后以模态方式呈现它。 (它有一个从我的店里提供数据的NSFetchedResultsController)。我在这里已经尝试了各种策略:
- 我做了一个NSFetchedResultsController保留的财产由主视图控制器
- 我所做的设置NSManagedObjectContext是由主视图控制器设置的保留属性;和
- 我已经在表单视图控制器的viewDidLoad方法的开始重复上面的两行代码内部使用单例。
无论我去时,一个问题,我只是不能解决的是,在用户关闭后deallocs表视图控制器(及其NSFetchedResultsController),我开始越来越在主视图控制器崩溃时商店被访问(如上面提到的“非法尝试”错误)。
处理这种常见应用程序模式的最佳做法是什么?我仍然希望使这个应用程序与iPhone SDK 3.x兼容,但是当我使用iOS 4时,似乎碰到的崩溃更少 - 如果3.x的底层问题导致了我的问题,请让我知道,我可能只针对iOS 4。
谢谢!
这是有帮助的......删除发布消息有助于iOS 4.0模拟器,但我仍然在我的3.x测试设备上发生崩溃。我检查了你的个人资料,你看起来对CoreData非常出色 - 你对这类应用的整体策略是什么?我想知道如果我是单身课程过于复杂的事情?当您需要从不同的视图控制器访问相同的CoreData存储时,创建上下文和FetchedResultsControllers的最佳方法是什么? – ed94133 2010-09-13 04:18:58
Marcus S. Zarra建议依赖注入来共享上下文。这个问题已经在这里讨论过了:http://stackoverflow.com/questions/3174610/passing-managedobjectcontext-along-to-view-controller-hierarchy – 2010-09-13 05:11:01
谢谢。我摆脱了这个单身人士,并将整个背景作为一个属性传递给我。这有助于防止运行时崩溃。但是,当我写入缓存时,我会以某种方式干扰它 - 在随后的阅读中,我在持久缓存周围发生致命错误。我想我应该把这个职位作为一个单独的问题。谢谢。 – ed94133 2010-09-15 03:20:37