Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 传递前向核心数据堆栈?_Ios_Swift_Core Data - Fatal编程技术网

Ios 传递前向核心数据堆栈?

Ios 传递前向核心数据堆栈?,ios,swift,core-data,Ios,Swift,Core Data,我试图学习核心数据,但我很困惑。我遵循的第一个教程来自(伦敦应用程序酿酒厂),它使用了cogen类并使用以下内容访问上下文: let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 然而,我最近购买并阅读了raywenderlich的教程中的核心数据,他们使用manual/none进行设置。并创建了自己的coreData堆栈: 进口基础 导入CoreData cl

我试图学习核心数据,但我很困惑。我遵循的第一个教程来自(伦敦应用程序酿酒厂),它使用了cogen类并使用以下内容访问上下文:

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
然而,我最近购买并阅读了raywenderlich的教程中的核心数据,他们使用manual/none进行设置。并创建了自己的coreData堆栈:

进口基础 导入CoreData

class CoreDataStack {

  private let modelName: String

  init(modelName: String) {
    self.modelName = modelName
  }

  lazy var managedContext: NSManagedObjectContext = {
    return self.storeContainer.viewContext
  }()

  private lazy var storeContainer: NSPersistentContainer = {

    let container = NSPersistentContainer(name: self.modelName)
    container.loadPersistentStores { (storeDescription, error) in
      if let error = error as NSError? {
        print("Unresolved error \(error), \(error.userInfo)")
      }
    }
    return container
  }()

  func saveContext () {
    guard managedContext.hasChanges else { return }

    do {
      try managedContext.save()
    } catch let error as NSError {
      print("Unresolved error \(error), \(error.userInfo)")
    }
  }
}
然后使用以下命令在viewController上访问它:

lazy var coreDataStack = CoreDataStack(modelName: "Potfolio")
但是教程非常简单,并且没有提到传递堆栈。我刚刚遇到了一个数据不保存的问题,在深入研究了教程代码后,我在应用程序代理中喜欢这样:

guard let tabController = window?.rootViewController as? UITabBarController,
      let employeeListNavigationController = tabController.viewControllers?[0] as? UINavigationController,
      let employeeListViewController = employeeListNavigationController.topViewController as? EmployeeListViewController else {
        fatalError("Application storyboard mis-configuration. Application is mis-configured")
    }

    employeeListViewController.coreDataStack = coreDataStack
这使我在使用segue向前传递堆栈时使用prepare:for()。然后它保存了我试图保存的数据


所以我的问题是:我无法想象将核心数据堆栈与segue一起传递是正确的方式?如果不是,那么向前传递堆栈的正确方法是什么?

您可以通过segues传递堆栈实例,但正如您所指出的,这样做感觉不正确,并且容易出错。实现这一点的一种方法是向
CoreDataStack
类添加一个static实例

类CoreDataStack{
静态let投资组合:CoreDataStack={
return CoreDataStack(型号名称:“投资组合”)
}()
...
}
这将取代视图控制器中实例化的惰性var。您可以在其位置添加:

class EmployeeListViewController:UIViewController{
让coreDataData=CoreDataStack.portfolio
...
}
在本例中,您创建了一个可以从应用程序代码中的任何位置访问的单个实例(singleton)