使用 Core Data 在多个视图控制器之间共享数据

Posted

技术标签:

【中文标题】使用 Core Data 在多个视图控制器之间共享数据【英文标题】:Sharing data between multiple view controllers with Core Data 【发布时间】:2012-01-27 22:28:53 【问题描述】:

我有一些从 UIViewController 的子类继承的视图控制器,我们将其称为 SpecialViewController。 SpecialViewController 的重点是存储所有其他视图控制器可以继承的所有冗余属性等。应用程序的生命周期从第一个视图控制器到最后一个视图控制器,收集了几条信息,以便通过最后一个视图控制器,将完整的数据条目保存到 Core Data。目前,我的 AppDelegate 是我的模型、上下文和持久存储协调器,并且我有一个名为 Person 的 NSManagedObject 子类。我的问题是,将数据构建到最后一个视图控制器然后保存的最佳方法是什么?

我可以将我的 Person NSManagedObject 实例从视图控制器传递到视图控制器,直到它准备好提交到 Core Data 数据库?

如果是这样,将我的 SpecialViewController 的指定初始化程序设置为如下方法是不是不好的设计:

-(id)initWithManagedObjectInstance:(Person *)personManagedObject

最后我可以获取完整的“Person”数据集(在最后一个视图控制器中)并将其提交到数据库...?

请随意争论我的想法,我想以最好的方式构建它。

【问题讨论】:

【参考方案1】:

不,我认为这行不通。您通常执行此操作的方式,或者至少是我执行此操作的方式,是将您的 ManagedObjectContext 从您的 AppDelegate 传递给您的第一个 SpecialViewController,然后从那里将它传递给每个连续的 SpecialViewController。确保 SpecialViewController 有一个定义为 @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 的属性,然后将其设置为您所在的任何类的 ManagedObjectContext:specialViewController.managedObjectContext = self.managedObjectContext; 用于您创建的每个新 SpecialViewController。然后你可以在最后保存它:

    NSError *error;
    if (![self.managedObjectContext save:&error]) 
        NSLog(@"Error saving: %@", error);
        // Error handling
    

编辑:哦,等等,我明白你在说什么,抱歉。是的,我认为你可以。哈哈。虽然没试过。我可能会通过创建一个与核心数据无关的Person 来做到这一点,将其从一个视图传递到另一个视图,然后当我需要保存它时,创建一个与insertNewObjectForEntityForName:inManagedObjectContext: 相关的核心数据并从另一个到新的。

【讨论】:

两个好建议,我想这是我需要的肯定。我将首先尝试传递上下文,因为我认为如果我决定稍后更改我与 Core Data 一起使用的信息,那会更好。谢谢!

以上是关于使用 Core Data 在多个视图控制器之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个视图控制器之间全局共享数据

在多个子类之间共享故事板视图控制器

Core Data 文档基于多个 nib 基于选择

使用 Core Data 提供的数据(在 SwiftUI 中)并与另一个视图共享

如何将字符串保存到Core Data Swift

仅获取共享特定属性值的 Core Data 对象