Estoy duplicando una aplicación de programa de televisión Objective-C existente en una nueva versión de Swift usando Xcode 6.1 y tengo algunos problemas con CoreData.
Creé un modelo de 4 entidades, creé su subclase NSManagedObject (en Swift), y todos los archivos tienen los objetivos de aplicación adecuados establecidos (para 'Compilar fuentes').
Sigo recibiendo este error cada vez que intento insertar una nueva entidad:
CoreData: advertencia: no se puede cargar la clase denominada 'Shows' para la entidad 'Shows'. Clase no encontrada, usando NSManagedObject predeterminado en su lugar.
Algunos comentarios:
Al guardar en Core Data, utilizo la forma de contexto padre-hijo para permitir subprocesos en segundo plano. Hago esto configurando ManagedObjectContext usando:
lazy var managedObjectContext: NSManagedObjectContext? = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
y guardando datos usando:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
context.parentContext = self.managedObjectContext!
...rest of core data saving code here...
})
fuente
@objc(MyClass)
Pero para aquellos que usan
@objc(myEntity)
Swift (como yo), pueden usar esta otra solución que funciona sin problemas.En la clase correcta de xcdatamodel. Debería verse así:
Aqui tienes.
Module.Class
es el patrón para CoreData en Swift y XCode 6. También necesitará el mismo procedimiento cuando use la clase Política personalizada en Política modelo u otras cosas de CoreData. Una nota: en la imagen, el nombre y la clase deben ser Car y MyAppName.Car (o cualquiera que sea el nombre de su entidad). AquíUser
hay un error tipográfico.fuente
Car
para ambos campos funcionó.Al usar Xcode 7 y puramente Swift, en realidad tuve que eliminar
@objc(MyClass)
de miNSManagedObject
subclase generada automáticamente (generada desde Editor> Create NSManagedObject Subclass...).fuente
En Xcode 7 beta 2 (y creo que 1), en la configuración del modelo se establece un nuevo objeto administrado de tipo
File
en el MóduloCurrent Product Module
y la clase del objeto se muestra en la configuración como.File
.Eliminar la configuración del módulo para que quede en blanco, o eliminar el punto final para que el nombre de la clase en la configuración sea solo
File
acciones equivalentes, ya que cada una provoca el otro cambio. Guardar esta configuración eliminará el error descrito.fuente
En Xcode 6.1.1 no es necesario agregar el atributo @objc ya que la entidad base es un subconjunto de una clase objc (NSManagedObject) (consulte Compatibilidad de tipos Swift . En CoreData se requiere el nombre completo de Module.Class. Tenga en cuenta el módulo name es lo que se establece en Build Settings -> Packaging -> Product Module Name. De forma predeterminada, se establece en $ (PRODUCT_NAME: c99extidentifier), que será el nombre del objetivo .
fuente
my-product
enmy_product
y esto marcó la diferencia en Core Data.Con xCode 7 y la versión Swift 2.0, no necesita agregar @objc (NameOfClass), simplemente cambie la configuración de la entidad en la pestaña "Mostrar el inspector del modelo de datos" como se muestra a continuación:
Nombre: "Nombre de su entidad"
Clase: "Nombre de su entidad"
Módulo - "Módulo de producto actual"
El código para el archivo de clase de entidad será como (en mi código, la entidad es familia):
Este ejemplo funciona bien en mi aplicación con xCode 7.0 + swift 2.0
fuente
No olvide reemplazar
PRODUCT_MODULE_NAME
con el nombre del módulo de su producto.Cuando se crea una nueva entidad, debe ir al Inspector del modelo de datos (última pestaña) y reemplazar
PRODUCT_MODULE_NAME
con el nombre de su módulo, o resultará unclass not found
error al crear el coordinador de tienda persistente.fuente
También necesita usar (al menos con Xcode 6.3.2) Module.Class al realizar su lanzamiento, por ejemplo: asumiendo que su módulo (es decir, el nombre del producto) es Comida y su clase es Fruta
Resumen:
fuente
También encontré un problema similar, siga estos pasos para resolver:
fuente
Cambiar el nombre de la clase de entidad en el editor del modelo de datos para que se corresponda con la clase en cuestión y agregarlo
@objc(NameOfClass)
al archivo de cada NSManagedObject justo encima de la declaración de clase me resolvió este problema durante las pruebas unitarias.fuente
Lo que funcionó para mí (Xcode 7.4, Swift) es cambiar el nombre de la clase a
<my actual class name>.<entity name>
en el inspector de entidades, cuadro 'Clase'.Mi iniciador de la subclase de objetos administrados se ve así:
fuente
Para Xcode 11.5: si la propiedad Codegen es la definición de clase y si no recibe una sugerencia para la entidad que creó en xcdatamodel. Intente salir de Xcode y vuelva a abrir su proyecto. Esto funciona para mi. Esta respuesta es solo si no recibe sugerencias, pero si su archivo no se genera, intente cualquiera de las respuestas anteriores.
fuente