I'm currently developing an application using SwiftUI.
I want to make a function to get some data in CoreData
model giving an id in the same CoreData
model.
This is an example function I want to make (doesn't work, just for explanation)
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
}
if I have this CoreData
model:
id (UUID) | task (String)
001 | meeting
002 | shopping
003 | cooking
And if I use the function like below:
let task = getDataById(id:001)
print(task) // meeting
It works like this.
My goal is to display some task
data as a list in WIdget
using id
data when the Widget
get fetch data.
(Like values for display in a list and tags to give a value to selection
when we use picker
)
Here is the code:
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
}
}
- UPDATED -
Persistence.swift (Host App)
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: Version 12.0.1
iOS: 14.0