我最初在我的应用程序中使用环境对象来管理我的应用程序中的状态,但现在需要 coreData。我应该删除环境对象吗?

Posted

技术标签:

【中文标题】我最初在我的应用程序中使用环境对象来管理我的应用程序中的状态,但现在需要 coreData。我应该删除环境对象吗?【英文标题】:I was initially using Environment objects in my app to manage state in my application, but now need coreData. Should i drop the environment object? 【发布时间】:2021-04-01 09:49:42 【问题描述】:

我很困惑如何将 CoreData 与我的应用程序集成。我使用环境对象作为我的模型来管理状态,但是这不会长期保持状态,并且需要在应用程序关闭时保存信息。因此我被告知要使用 CoreData,但我现在已经设置了我的第一个实体,但不知道如何将它集成到我的应用程序中。

有什么方法可以将环境对象设置为我的 CoreData 的实体,并在应用程序关闭后更新 coreData 等。

为了给出一些上下文,我有环境对象,当用户输入一些信息时会发生变化,并使用该环境对象将数据存储在我的 CoreData 中。然后如何更改每个视图上的环境对象以匹配我的 CoreData (是否在某些初始化程序中?)

谢谢

【问题讨论】:

【参考方案1】:

查看斯坦福 ios 课程episode 12。

如何将 CoreData 添加到现有应用的一个很好的示例。

使用@FetchedResults 属性包装器让您的视图使用CoreData 数据库的内容进行更新。 (hackingwithswift example)

注意:在您的视图中使用@StateObject 属性包装器而不是@ObservableObject。斯坦福讲师使用的是旧版本的 SwiftUI。现在推荐的实现是使用@StateObject。

【讨论】:

【参考方案2】:

我猜在这种情况下你不需要环境对象,因为 CoreData 信息可以直接使用,它也会更新你的视图。

首先需要在Environment中添加CoreData的persistenceControler:

@main
struct YourApp: App 
    let persistenceController = PersistenceController.shared
    
    @StateObject var otherEnvironmentStuff: OtherEnvironmentStuff = OtherEnvironmentStuff()
    
    var body: some Scene 
        WindowGroup 
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
                .environmentObject(otherEnvironmentStuff)
        
    

然后你可以直接在所有视图中使用CoreData,并添加数据,将直接在视图中使用:

struct MyView: View 
    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(
        entity: EntityClassName.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \EntityClassName.name, ascending: false)],
        predicate: NSPredicate(format: "someAttributeName == %@", NSNumber(value: false)),
        animation: .default)
    private var myEntities: FetchedResults<EntityClassName>
    
    var body: some View 
        Text("Do Whatever you want with the CoreData data...")
    

    func addValue() 
        let newEntity: EntityClassName = EntityClassName(context: viewContext)
        newEntity.someAttributeName = someValueToSet
        do 
            try viewContext.save()
         catch 
            print(error.localizedDescription)
        
    

如果您不需要谓词或排序描述符,只需删除它们即可。

如果您没有 PersistanceController,只需使用 CoreData 为 SwiftUI 创建一个新的 Xcode Porject,Xcode 将为您创建一个,您可以将其复制到您当前的项目中。

【讨论】:

以上是关于我最初在我的应用程序中使用环境对象来管理我的应用程序中的状态,但现在需要 coreData。我应该删除环境对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

初始化对象以显示在我的脚手架中

注册表单:无法隐藏字段

如何在我的应用程序的所有视图中管理 AVAudioplayer

silverlight 应用程序不能使用 wcf 命名空间

Javascript内存和泄漏问题

我如何才能等到我的 Android 应用程序中的协程作用域执行完成?