Swift-传递CoreDataStack还是仅传递上下文?

Swift-传递CoreDataStack还是仅传递上下文?,swift,core-data,Swift,Core Data,我想找出核心数据。我一直在学习一些不同的教程,它们做的事情都有点不同 我有一个CoreDataStack,它在SceneDelegate lazy var coreDataStack = CoreDataStack(modelName: "model") 我相信我会使用依赖项注入?在视图控制器中设置相应的属性 guard let tabController = window?.rootViewController as? UITabBarController,

我想找出核心数据。我一直在学习一些不同的教程,它们做的事情都有点不同

我有一个
CoreDataStack
,它在
SceneDelegate

lazy var coreDataStack = CoreDataStack(modelName: "model")
我相信我会使用
依赖项注入?
视图控制器中设置相应的属性

guard let tabController = window?.rootViewController as? UITabBarController,
      let viewController = navigationController.topViewController as? ViewController else {
    fatalError("Application storyboard mis-configuration. Application is mis-configured")
}
viewController.coreDataStack = coreDataStack
viewController.context = coreDataStack.ManagedObjectContext
我的问题是,我是否应该将整个coreDataStack对象传递到下一个视图?或者只是上下文

起初我通过了整个coreDataStack,一切似乎都很好。但我不确定这是否正确,因为大多数教程似乎只参考上下文。(但即便如此,大多数教程还是大不相同,即使它们是由同一位作者编写的。)


这取决于你想在vc里做什么。通常,我建议使用临时上下文保存数据,使用主上下文只读-请参阅。然后,您可能希望传递整个CoreDataStack,因为主上下文可能不够。因此,传递
CoreDataStack
还是只传递
上下文
并不重要?我昨天发现了关于子上下文的情况,所以我正在重构以删除coreDataStack,但最终我遇到了一个案例,我在选项卡栏中切换到一个主VC,它需要整个堆栈。。。这导致了进一步的混乱。再一次,这取决于你在vc中真正想做什么——是仅仅获取还是其他什么。你也可以看看一些带有属性包装器的Spring风格的依赖注入——可以找到一个例子,我真的不知道我在做什么。这就是为什么我很想知道传递上下文而不是整个
coreDataStack
的好处是什么-每个VC都是一个FRC。然后转到对象的详细视图。(可编辑),或添加新对象。(两者都使用子上下文)。然后在详细信息中,还有一些其他风险投资公司可以更深入地添加/编辑其他详细信息。也可以使用子上下文。若你们的应用程序很简单,核心数据的使用也很简单,那个么你们可以只使用一个上下文,然后你们可以传递它,而不是堆栈类,为什么要让它更难呢?但对于更大的应用程序或更复杂的用例,您可能需要使用前面提到的不同上下文,然后需要stack类来实现这一点。我想这里没有明确的对错,但是如果你使用stack类,即使是一个简单的应用程序,你也会习惯它,你可以在未来的应用程序中重复使用它和你的知识。
import UIKit
import CoreData

class CoreDataStack {
    
    private let modelName: String
    
    
    init(modelName: String) {
        self.modelName = modelName
        setupNotificationHandling()
    }
    
    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
    }()
    
    
    // MARK: - Notification Handling
    
    func saveForDidEnterBackground() {
        saveContext()
    }
    
    @objc func saveChanges(_ notification: Notification) {
        saveContext()
    }
    
    // MARK: - Helper Methods
    
    private func setupNotificationHandling() {
        let notificationCenter = NotificationCenter.default
        notificationCenter.addObserver(self,
                                       selector: #selector(saveChanges(_:)),
                                       name: UIApplication.willTerminateNotification,
                                       object: nil)
    }
    
    // MARK: -
    
    private func saveContext() {
        guard managedContext.hasChanges else { return }
        
        do {
            try managedContext.save()
        } catch {
            print("Unable to Save Managed Object Context")
            print("\(error), \(error.localizedDescription)")
        }
    }
    
}