这是我的视图控制器的设置方式:我有一个Main
视图控制器,它包含一个水平滚动视图,并充当容器。这个容器有另外三个视图控制器,我们称之为A
,B
和C
,我在其中添加了不同的数据:
A
中,我添加了开始和结束时间,然后点击下一步B
中,我添加了一个消息字符串,然后单击“下一步”C
我添加更多数据,然后点击完成在C
中,当按下完成时,我想将所有三个视图控制器中的数据保存到核心数据。
我现在的做法是C
我只是使用代理人从save()
调用Main
方法。
内部Main
我在保存到核心数据时,只需从IBOutlets
,A
和B
拨打C
。
我不确定这是否是正确的解决方案 还有其他优雅的解决方案吗?我正在寻找一些我可以轻松进行单元测试的东西。
答案 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,否则你可能会遇到一些问题。