如何在从多个视图控制器输入数据时更新Core Data

时间:2017-05-20 13:13:11

标签: ios swift

这是我的视图控制器的设置方式:我有一个Main视图控制器,它包含一个水平滚动视图,并充当容器。这个容器有另外三个视图控制器,我们称之为ABC,我在其中添加了不同的数据:

  • A中,我添加了开始和结束时间,然后点击下一步
  • B中,我添加了一个消息字符串,然后单击“下一步”
  • C我添加更多数据,然后点击完成

C中,当按下完成时,我想将所有三个视图控制器中的数据保存到核心数据。

我现在的做法是C我只是使用代理人从save()调用Main方法。

内部Main我在保存到核心数据时,只需从IBOutletsAB拨打C

我不确定这是否是正确的解决方案 还有其他优雅的解决方案吗?我正在寻找一些我可以轻松进行单元测试的东西。

1 个答案:

答案 0 :(得分:0)

在你的情况下我会使用Singleton,虽然有些人可能不赞成我认为在你的实例中它可能会有所帮助:

final class DataCoordinator: NSObject {

private override init() {
print("Data Coordinator Initialized")
}
//Shared Instance:
static let appData = DataCoordinator()

var someVar: String = "" //public variable
fileprivate var mysteryNumber: Int = 0
...

并访问如下属性:

DataCoordinator.appData.someVar

确保您可以通过从app delegate中调用它来访问每个VC中的单例...

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
   ...
    print(DataCoordinator.appData)
   ... 
    return true
}

您也可以让它处理CoreData,也就是说您可以将上下文设置为数据协调器中的共享属性,然后从任何视图控制器访问它,并使用典型函数保存它:

public func saveContext () {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
print("Data Saved to Context")
} catch {
      let nserror = error as NSError
      fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}
//use like this
DataCoordinator.appData.saveContext()

您也可能会发现编写函数或使用didSet清除变量很方便。同样,您也可以让DataCoordinator从CoreData重新加载数据。我自己并不是这种方法的忠实粉丝,但在适当的时候使用它,我强烈建议你在实施之前阅读Singletons,否则你可能会遇到一些问题。