在整个应用程序中使用此 NSManagedObjectContext 是一种好习惯吗
Posted
技术标签:
【中文标题】在整个应用程序中使用此 NSManagedObjectContext 是一种好习惯吗【英文标题】:Is it good practice to use this NSManagedObjectContext throughout the all app 【发布时间】:2012-04-03 17:12:14 【问题描述】:我的应用程序使用 Core Data,我在 Xcode 中创建项目时使用了 CoreData 模板,所以我的 AppDelegate 文件中已经有 NSManagedObjectContext
对象,但是在所有应用程序中使用此上下文是否是一种好习惯(移动它从一个 viewController 到另一个)?
还是出于不同的原因分配更多更好?
【问题讨论】:
【参考方案1】:对于我所做的大多数应用程序,如果我要在后台线程中工作,我通常只创建一个新的 managedObjectContext。
我倾向于通过分配一个 ivar 将 managedObjectContext 从呈现的 viewController 传递给呈现的 viewController,或者如果没有一些 CoreData 魔法控制器根本无法工作,我将它放在指定的 init 方法中。
如果我在表格中选择一行并呈现一个新的 viewController,我将只传递所选的 managedObject,然后如果我需要 managedObjectContext,我可以使用 [managedObject managedObjectContext];
我不喜欢单例的想法,因为 Core Data 的东西已经很难在没有违反告诉不问规则的类的情况下隔离测试。
【讨论】:
【参考方案2】:这样做很好。你需要注意的是,如果你想用多线程管理多个数据库条目,你必须在你的对象上下文中使用锁定,并创建多个对象上下文以实现更高的安全性,确保多个上下文不会同时在同一个数据库上写入,同时避免多次调用同一个上下文会导致数据库死锁。
【讨论】:
查看developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 了解有关并发和核心数据的更多信息【参考方案3】:这样做绝对没问题(至少如果您留在 GUI 线程中)。但你问的是好的做法。这就是 Xcode 的核心数据模板可以改进的地方。阅读此Blogentry,了解 Apple 应该如何做得更好。
【讨论】:
【参考方案4】:是的,你最好只这样做。每当您在任何课程中需要它时,从AppDelegate
文件中复制NSManagedObjectContext
。使用此行来复制它。我在我的项目中使用它并且效果很好:
if (self.managedObjectContext == nil)
self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", self.managedObjectContext);
【讨论】:
以上是关于在整个应用程序中使用此 NSManagedObjectContext 是一种好习惯吗的主要内容,如果未能解决你的问题,请参考以下文章