Estou duplicando um aplicativo Objective-C TV Show existente para uma nova versão do Swift usando o Xcode 6.1 e estou tendo alguns problemas com CoreData.
Eu criei um modelo de 4 entidades, criei sua subclasse NSManagedObject (em Swift) e todos os arquivos têm os destinos de aplicativo adequados definidos (para 'Compile Sources').
Ainda recebo este erro sempre que tento inserir uma nova entidade:
CoreData: aviso: Incapaz de carregar a classe chamada 'Shows' para a entidade 'Shows'. Classe não encontrada, usando o NSManagedObject padrão.
Alguns comentários:
Ao salvar no Core Data, eu uso a forma de contexto pai-filho para permitir threading em segundo plano. Eu faço isso configurando o 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
}()
e salvando dados 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...
})
fonte
@objc(MyClass)
Mas para aqueles que usam o
@objc(myEntity)
Swift (como eu), você pode usar esta outra solução, que funciona sem problemas.Na classe correta xcdatamodel em. Deve ser assim:
Aqui está.
Module.Class
é o padrão para CoreData em Swift e XCode 6. Você também precisará do mesmo procedimento ao usar a classe de Política Personalizada na Política de Modelo ou outras coisas CoreData. Uma nota: Na imagem, o nome e a classe devem ser Car e MyAppName.Car (ou qualquer que seja o nome da sua entidade). AquiUser
está um erro de digitação.fonte
Car
para os dois campos funcionou.Ao usar o Xcode 7 e puramente Swift, eu realmente tive que remover
@objc(MyClass)
da minhaNSManagedObject
subclasse gerada automaticamente (gerada a partir de Editor> Create NSManagedObject Subclass...).fonte
No Xcode 7 beta 2 (e acredito que 1), na configuração do modelo, um novo objeto gerenciado do tipo
File
é definido para o MóduloCurrent Product Module
e a classe do objeto é mostrada na configuração como.File
.Excluir a configuração do módulo para que fique em branco ou remover o ponto final para que o nome da classe na configuração seja apenas
File
ações equivalentes, pois cada uma causa a outra alteração. Salvar esta configuração removerá o erro descrito.fonte
No Xcode 6.1.1, você não precisa adicionar o atributo @objc, pois a entidade base é um subconjunto de uma classe objc (NSManagedObject) (consulte Compatibilidade de tipo Swift . Em CoreData, o nome completo do Module.Class é obrigatório. Esteja ciente do módulo name é o que é definido em Build Settings -> Packaging -> Product Module Name. Por padrão, isso é definido como $ (PRODUCT_NAME: c99extidentifier), que será o nome do destino .
fonte
my-product
emmy_product
, e isso fez toda a diferença para o Core Data.Com o xCode 7 e a versão Swift 2.0, você não precisa adicionar @objc (NameOfClass), apenas altere as configurações de entidade na guia "Mostrar o Inspetor de modelo de dados" como abaixo -
Nome - "Nome de sua entidade"
Classe - "Seu nome de entidade"
Módulo - "Módulo de produto atual"
Código para arquivo de classe Entity será como (no meu código Entity is Family) -
Este exemplo está funcionando bem em meu aplicativo com xCode 7.0 + swift 2.0
fonte
Não se esqueça de substituir
PRODUCT_MODULE_NAME
pelo nome do módulo do seu produto.Quando uma nova entidade é criada, você precisa ir para o Data Model Inspector (última guia) e substituir
PRODUCT_MODULE_NAME
pelo nome do seu módulo, ou resultará em umclass not found
erro ao criar o coordenador de armazenamento persistente.fonte
Você também precisa usar (pelo menos com o Xcode 6.3.2) Module.Class ao realizar seu elenco, por exemplo: Assumindo que seu módulo (ou seja, nome do produto) é Food e sua classe é Fruit
Recapitular:
fonte
Eu também encontrei um problema semelhante, siga estas etapas para resolver:
fonte
Alterar o nome da classe de entidade no editor de modelo de dados para corresponder à classe em questão e adicionar
@objc(NameOfClass)
ao arquivo de cada NSManagedObject logo acima da declaração da classe resolveu esse problema para mim durante o teste de unidade.fonte
O que funcionou para mim (Xcode 7.4, Swift) foi mudar o nome da classe para
<my actual class name>.<entity name>
no inspetor de entidade, caixa 'Classe'.Meu iniciador da subclasse de objeto gerenciado se parece com isto:
fonte
Para Xcode 11.5: se a propriedade Codegen for a classe Definição, e se você não estiver recebendo uma sugestão para a entidade que criou no xcdatamodel. Tente sair do Xcode e reabrir seu projeto novamente. Funciona para mim. Esta resposta é apenas se você não estiver recebendo sugestões, mas se o seu arquivo não for gerado, tente qualquer resposta acima.
fonte