CoreData + SwiftUI
Aquí puedes ver el artículo original
Recientemente tuve que crear una aplicación usando SwiftUI y CoreData .
Pensé que CoreData se usaba casi como lo usarías con UIKit, pero aparentemente hay algunas diferencias.
Esta guía pretende ser un resumen de mi experiencia usando CoreData combinado con SwiftUI. Si encuentro otros aspectos, los agregaré a esta guía.
Así que, sin más preámbulos, comencemos.
Configuración
Esta es una parte bastante sencilla.
- Si inicia un nuevo proyecto, puede marcar la opción ' Usar Core Data ' y ' Hospedar en CloudKit ' si desea guardar los datos de sus usuarios en la nube. En este caso, XCode se encargará de configurar el proyecto por usted. (Para la parte de CloudKit, deberá realizar algunos pasos adicionales).
- Si ya tiene un proyecto, deberá crear un archivo Persistence.swift y un archivo Swift donde inicialice la pila CoreData. (Incluso puede crear un nuevo proyecto siguiendo el paso anterior y copiar el archivo Persistence.swift generado por XCode a su proyecto.

Ahora que tiene su proyecto, para poder usar CoreData dentro de sus Vistas, necesita pasar la managedObjectContext
jerarquía de vistas hacia abajo.
Por lo general, esto se hace en su archivo [appname]App.swift .
PersistenceController ( aquí hay un ejemplo ) es la estructura que XCode genera automáticamente cuando inicia un nuevo proyecto con la opción 'Usar datos básicos' marcada.
@main
struct ExampleApp: App {
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(persistenceController)
.environment(\.managedObjectContext, persistenceController.container.viewContext)
}
}
}
Genial, ahora puede crear, leer, actualizar y eliminar NSManagedObjects en sus vistas.
Operando con CoreData
Para operar con CoreData, debe acceder al NSManagedObjectContext. Para hacerlo, tienes dos opciones:
- Usando el envoltorio @ Environment en sus vistas
@Environment(\.managedObjectContext) private var viewContext
@EnvironmentObject private var persistenceController: PersistenceController
do {
if container.viewContext.hasChanges {
try container.viewContext.save()
}
} catch {
print(error)
}
Para guardar un NSManagedObject, primero debe instanciarlo y luego configurar sus propiedades. Y luego guarde el contexto.
let note = Note(context: container.viewContext)
note.id = id
note.text = text
note.folder = folder
note.creationDate = Date()
saveContext()
Obteniendo objetos
Ahora la parte de buscar, aquí es donde encontré la mayoría de las dificultades. Comencemos de inmediato.
Para obtener objetos en SwiftUI, la forma más conveniente de hacerlo es usar los envoltorios @FetchRequest o @SectionedFetchRequest , en cada Vista que necesita leer de CoreData.
Pasar objetos obtenidos entre vistas interrumpirá las actualizaciones automáticas en caso de que agregue, edite o elimine objetos. (Si conoce una forma de pasar a buscar objetos sin romper las actualizaciones, hágamelo saber y actualizaré esta guía)
Por lo tanto, debe agregar un @FetchRequest en cada vista que necesite objetos CoreData y actualizaciones automáticas. Sé que es un poco molesto, pero valdrá la pena.
Entonces, dicho esto, el código es el siguiente:
@FetchRequest(entity: \Object.type,
sortDescriptors: [NSSortDescriptor],
predicate: NSPredicate,
animation: .default)
var objects: [Object]
@SectionedFetchRequest(entity: \Object.type,
sectionIdentifier: \Object.property,
sortDescriptors: [NSSortDescriptor],
predicate: NSPredicate,
animation: .default)
var sections: SectionedFetchResults<YourSectionType, Object>
List(sections) { section in
Section(section.id) {
ForEach(section) { object in
// Configure your view with the object
}
}
}
Usando @FetchRequest o @SectionedFetchRequest dondequiera que agregue, actualice o elimine un objeto, las vistas se actualizan automáticamente.
Ahora, si necesita usar @FetchRequest con un NSPredicate que tiene un parámetro pasado desde la vista principal, descubrí que la siguiente opción funciona maravillosamente.
@FetchRequest
var objects: FetchedResults<Object>
init(id: ID) {
_objects = FetchRequest<Object>(predicate: NSPredicate(format: "id == %@", id))
}
Actualización de objetos
Para actualizar un NSManagedObject
necesitará tener el NSManagedObject
para actualizar, obtener como se describe anteriormente y actualizar sus propiedades. Y luego guarde el contexto.
note.text = newText
note.folder = newFolder
saveContext()
Para eliminar un NSManagedObject
necesitará tener el NSManagedObject
para actualizar, obtener como se describe anteriormente y eliminarlo.
viewContext.delete(object)
Conclusión
Eso es todo lo que he descubierto hasta ahora sobre CoreData utilizado con SwiftUI. Esta guía se actualizará constantemente.
Si desea sugerir una mejor manera de hacer algo, deje un comentario y actualizaré esta guía con la mejor opción.
Espero haberte ayudado en tu viaje con SwiftUI y el desarrollo de iOS.
DEJA UN APLAUSOS si te ha gustado este artículo te lo agradezco mucho.
¡Nos vemos en la próxima guía!
Si desea apoyar mi trabajo y ver esta guía en acción, consulte BrainDump — Notes & Writing .
gracias