es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo nil en managedObjectContext en CoreData con Swift al trabajar desde una biblioteca.

Estoy desarrollando una biblioteca para iOS utilizando Swift 5, y quiero que esta biblioteca utilice CoreData independientemente de la aplicación que consume esa biblioteca y esto es lo que he hecho hasta ahora:
1. He creado las entidades con sus respectivos tipos de datos
2. He creado el archivo .xcdatamodeld, que contiene las entidades
3. He creado un CoreDataManager que luce así:

// MARK: - CoreDataManager
final class CoreDataManager {
    static let shared = CoreDataManager()
    private static let defaultObject = NSManagedObject.init()

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Audit")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
}

Y el problema es que estoy intentando obtener el contexto así:

let coreDataManager = CoreDataManager.shared
let context = coreDataManager.persistentContainer.viewContext

y context está devolviendo nil.

Por favor ayuda.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que has creado una clase CoreDataManager y un contenedor persistente para tus entidades de CoreData. Sin embargo, parece que estás intentando acceder a la propiedad viewContext de tu contenedor persistente antes de que haya terminado de cargarse.

    Para resolver este problema, puedes modificar tu clase CoreDataManager para incluir un método que obtenga el contexto solo cuando esté listo, de la siguiente manera:

    // MARK: - CoreDataManager
    final class CoreDataManager {
        static let shared = CoreDataManager()
        private static let defaultObject = NSManagedObject.init()
    
        lazy var persistentContainer: NSPersistentContainer = {
            let container = NSPersistentContainer(name: "Audit")
            container.loadPersistentStores(completionHandler: { (storeDescription, error) in
                if let error = error as NSError? {
                    fatalError("Error no resuelto \(error), \(error.userInfo)")
                }
            })
            return container
        }()
    
        func getContext() -> NSManagedObjectContext {
            return persistentContainer.viewContext
        }
    }
    

    Luego puedes obtener el contexto llamando al método en tu código:

    let coreDataManager = CoreDataManager.shared
    let context = coreDataManager.getContext()
    

    Esto debería darte un contexto no nulo que puedes usar para realizar operaciones de CoreData.

Comments are closed.