ios - 如何在一个 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)
}
解决方案
使这个“上下文”全球化
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)
}
}
推荐阅读
- reactjs - 如何在页面加载时获取数据,然后使用 useEffect 获取按钮单击
- search - 有没有办法根据保存的搜索编写计划更新脚本?
- ansible - Ansible 错误:“列表对象”在使用 read_csv 模块时没有属性“名称”
- eclipse - .classpath / .settings 文件夹存在于 Eclipse 但我找不到它
- javascript - 使用 UrlFetchApp 进行 Facebook API 营销
- php - 如何使用尊重验证验证电子邮件列表
- r - 在 Shiny 中,如何添加标志性的复选框组输入以根据选择创建数据表,其中包含列名上的图标而不是文本?
- reactjs - 使用 React Storybook 的 Knob 插件避免重复道具名称的可重用功能?
- javascript - jest.mock 模块工厂函数调用
- java - 将某个 json 值传递给另一个活动