【发布时间】:2021-01-07 19:30:03
【问题描述】:
我目前正在使用 SwiftUI 开发应用程序。
我想创建一个函数来获取CoreData 模型中的一些数据,并在同一CoreData 模型中给出一个ID。
这是我想做的一个示例函数(不起作用,只是为了解释)
func getDataById(id:UUID) -> String { // give an id in model
return task // return an task in model which has the same id of the argument
}
如果我有这个CoreData 模型:
id (UUID) |任务(字符串)
001 |会议
002 |购物
003 |烹饪
如果我使用如下函数:
let task = getDataById(id:001)
print(task) // meeting
它是这样工作的。
我的目标是在Widget 获取数据时使用id 数据将一些task 数据显示为WIdget 中的列表。
(当我们使用picker 时,就像在列表和标签中显示的值一样给selection 赋值)
代码如下:
IntentHandler.swift
import WidgetKit
import SwiftUI
import CoreData
import Intents
class IntentHandler: INExtension,ConfigurationIntentHandling {
var moc = PersistenceController.shared.managedObjectContext
func provideNameOptionsCollection(for intent: ConfigurationIntent, searchTerm: String?, with completion: @escaping (INObjectCollection<NSString>?, Error?) -> Void) {
// let request = NSFetchRequest<TimerEntity>(entityName: "TodoEntity")
let request = NSFetchRequest<TodoEntity>(entityName: "TodoEntity")
var nameIdentifiers:[NSString] = []
do{
let results = try moc.fetch(request)
for result in results{
nameIdentifiers.append(NSString(string: result.id?.uuidString ?? "")) // I want display task data using id data here.
}
}
catch let error as NSError{
print("Could not fetch.\(error.userInfo)")
}
let allNameIdentifiers = INObjectCollection(items: nameIdentifiers)
completion(allNameIdentifiers,nil)
}
override func handler(for intent: INIntent) -> Any {
return self
}
}
- 已更新 -
Persistence.swift(宿主应用)
import CoreData
import Foundation
class PersistenceController {
static let shared = PersistenceController()
private init() {}
private let persistentContainer: NSPersistentContainer = {
let storeURL = FileManager.appGroupContainerURL.appendingPathComponent("TodoEntity")
let container = NSPersistentContainer(name: "Todo")
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeURL)]
container.loadPersistentStores(completionHandler: { storeDescription, error in
if let error = error as NSError? {
print(error.localizedDescription)
}
})
return container
}()
}
extension PersistenceController {
var managedObjectContext: NSManagedObjectContext {
persistentContainer.viewContext
}
}
extension PersistenceController {
var workingContext: NSManagedObjectContext {
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = managedObjectContext
return context
}
}
extension FileManager {
static let appGroupContainerURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.sample.Todo")!
}
Xcode:版本 12.0.1
iOS:14.0
【问题讨论】:
-
"如果我有这个 CoreData 模型..." - 它在哪里调用,你如何访问它?有任何获取请求吗?
-
您需要在获取请求中使用
NSPredicate。如果您发布有关模型的更多详细信息,有人可能会帮助您弄清楚如何设置谓词。 -
@pawello2222,@Tom Harrington,感谢您的评论,我更新了我的问题。
-
getDataById在做什么? -
@Pranav Kasetti,
getDataById在模型中接收id,然后在同一模型的同一行中返回task。
标签: swift core-data swiftui widgetkit