SwiftUI 生命周期不支持 CoreData

Posted

技术标签:

【中文标题】SwiftUI 生命周期不支持 CoreData【英文标题】:SwiftUI Life Cycle not supporting CoreData 【发布时间】:2020-07-29 15:00:36 【问题描述】:

我正在创建一个新的 ios 应用程序并希望从 SwiftUI 而不是 Storyboard 开始,因为在这种情况下向后兼容性没有问题。观看 WWDC 2020 视频时,我注意到了新的生命周期选项:SwiftUI 应用程序。这看起来很有趣,因为它根本不再使用 Storyboard,这对我来说似乎更干净。

无论如何,我应该如何保存我的数据,因为 CoreData 不适用于此选项。我读到人们只是手动添加了 CoreData,但这对我来说也很奇怪,因为 Apple 目前显然不想要这个。

【问题讨论】:

我没有使用过这个,但我的猜测是因为你不再获得一个 AppDelegate 类,CoreData 设置不能放在那里,目前不支持自动执行此操作。当然,您仍然可以使用 Core Data,但您需要创建自己的管理器类(很多人已经这样做了),并且您必须手动添加模型文件,但一旦完成,您就可以正常使用 Core Data。 猜对了。删除 AppDelegate 是唯一原因,这很有意义。 【参考方案1】:

更新

这看起来现在在 Xcode 12.0 中得到修复


原答案

目前似乎没有自动化方法。您需要创建自己的 CoreData 容器。这可以在主应用程序中完成。

示例可能如下所示:

import CoreData
import SwiftUI

@main
struct TestApp: App 
    var body: some Scene 
        WindowGroup 
            ContentView()
                .environment(\.managedObjectContext, persistentContainer.viewContext)
        
    

    var persistentContainer: NSPersistentContainer = 
        let container = NSPersistentContainer(name: "TestApp")
        container.loadPersistentStores(completionHandler:  storeDescription, error in
            if let error = error as NSError? 
                fatalError("Unresolved error \(error), \(error.userInfo)")
            
        )
        return container
    ()

    func saveContext() 
        let context = persistentContainer.viewContext
        if context.hasChanges 
            do 
                try context.save()
             catch 
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            
        
    

请注意,您必须手动将数据模型添加到您的项目中。

您可以查看此链接以获得更好的解释:

Using Core Data with SwiftUI 2.0 and Xcode 12

或者,您可以按照此处的建议为您的核心数据堆栈创建一个单例:

Accessing Core Data Stack in MVVM application

【讨论】:

以上是关于SwiftUI 生命周期不支持 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

如何为不同环境的 SwiftUI App 生命周期应用程序运行 UI 测试?

SwiftUI CoreData 过滤列表删除意外失败

如何更改应用程序色调颜色(新的 SwiftUI 生命周期应用程序)?

SwiftUI 核心数据

SwiftUI Core Data 在 DetailView 中绑定 TextFields

在同一个多平台(iOS、macOS、watchOS、tvOS)应用程序中支持不同的生命周期方法