在整个应用程序中使用此 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 是一种好习惯吗的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 3.0 设置

gRPC:我应该为整个应用程序使用单个客户端吗?

nsobject 与 nsmanagedobject 的优缺点

不能在 NSManagedObject 中存储双倍

整个应用程序中BillingClient的一个实例

如何在整个应用程序中共享CLLocation?