首页 > 解决方案 > 如何在一个 ViewController 和另一个控制器之间共享核心数据(小部件)

问题描述

我想在 viewcontroller.swift 中保存数据,并在 widget.swift 中获取数据

但我不知道如何访问小部件中的核心数据。

如何访问/获取小部件中的核心数据?

这是我的代码:

在 viewController.swift 中

var container: NSPersistentContainer!
let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.container = appDelegate.persistentContainer

let entity = NSEntityDescription.entity(forEntityName: "Entity", in: context)

if let entity = entity {
    let myentity = NSManagedObject(entity: entity, insertInto: context)
    myentity.setValue("my name", forKey: "name")
}

在小部件.swift

func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
    
    let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: <myGroupID>)!
    let storeURL = containerURL.appendingPathComponent("DataModel.sqlite")
    let description = NSPersistentStoreDescription(url: storeURL)

    let container = NSPersistentContainer(name: "Entity")
    container.persistentStoreDescriptions = [description]
    container.loadPersistentStores { description, error in
        if let error = error {
            fatalError("Unable to load persistent stores: \(error)")
        } }
    
    
    let moc = CoreDataStack.shared.managedObjectContext
    let predicate = NSPredicate(format: "attribute1 == %@", "test")
    let request = NSFetchRequest<Entity>(entityName: "Entity")
    let result = try? moc.fetch(request)
}


    

标签: iosswift

解决方案


使这个“上下文”全球化

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

首先创建 NSManagedObject 子类:

第1步:

YourEntity+CoreDataClass.swift

import Foundation
import CoreData

public class YourEntity: NSManagedObject {

}

YourEntity+CoreDataProperties.swift

import Foundation
import CoreData

extension YourEntity {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<YourEntity> {
        return NSFetchRequest<YourEntity>(entityName: "YourEntity")
    }

    @NSManaged public var attribute1: String?
    @NSManaged public var name: String?

}

第 2 步:将数据保存在 YourEntity 中(我认为您正确存储了它)

第 3 步:从 YourEntity 获取数据

您可以从任何地方获取数据(在 widget.swift 中)

func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping ([YourEntity]) -> ()) {
        var yourResult : [YourEntity]?
        let request: NSFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourEntity")
        request.predicate = NSPredicate(format: "attribute1 == %@", "test")
        do {
            yourResult = try context.fetch(request) as? [YourEntity]
            completion(yourResult)
        } catch let error as NSError{
            print(error.localizedDescription)
        }
    }

推荐阅读