进阶课程(8)CoreData本地数据

以下是一个简单的 Core Data Persistence Controller,可以在 SwiftUI 中使用。

SwiftUI 和 UIKit 是两种不同的界面框架,它们之间没有直接的互相调用方法。如果您想在 SwiftUI 中使用 UIKit 中的视图,可以使用 UIViewRepresentable 协议将 UIKit 视图包装成 SwiftUI 视图,然后在 SwiftUI 界面中使用。

下面是一个示例,展示了如何使用 UIViewRepresentable 协议在 SwiftUI 中使用 UIKit 中的 MFMailComposeViewController 视图:

import CoreData

struct PersistenceController {
    static let shared = PersistenceController()

    let container: NSPersistentContainer

    init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "YourAppName")

        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }

    func save() {
        let context = container.viewContext

        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
}

要使用这个 PersistenceController,你可以将其设置为一个环境对象并在 SwiftUI 中注入它。

@main
struct YourAppNameApp: App {
    let persistenceController = PersistenceController.shared

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

在这个示例中,我们将 PersistenceController 设置为 YourAppNameApp 的属性,并在 ContentView 中注入了 managedObjectContext。这样,我们就可以在 SwiftUI 中访问 Core Data 了。

例如,你可以在 SwiftUI 视图中执行查询、添加、删除等操作,如下所示:

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    var body: some View {
        // Perform Core Data operations using the viewContext
        // ...
    }
}