CoreData: warning: Unable to load class named

匿名 (未验证) 提交于 2019-12-03 01:27:01

问题:

I am duplicating an existing Objective-C TV Show app to a new Swift version using Xcode 6.1 and am having some issues with CoreData.

I have created a model of 4 entities, created their NSManagedObject subclass (in Swift), and all files have the proper app targets set (for 'Compile Sources').

I am still getting this error whenever I try to insert a new entity:

CoreData: warning: Unable to load class named 'Shows' for entity 'Shows'. Class not found, using default NSManagedObject instead.

A few comments:

When saving to Core Data, I use the parent-child context way to allow background threading. I do this by setting up the ManagedObjectContext using:

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 }() 

and by saving data using:

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... }) 

回答1:

This warning is one of the quirks we have to deal with while the details of the Swift implementation are being ironed out. The warning occurs spuriously, i.e. your setup might work even if you do not follow the steps outlined below.

I have been able to get rid of it in most cases by making sure that the class is set correctly in the model editor. Unlike in many other SOF posts (including answers to this question), the suggestion to include the module name (like MyApp.Shows) has not helped me.

Make sure you check these three items:

1.
Version that works up to Xcode 7 beta 3

Notice that I corrected your entity name to the more appropriate singular.

Version that works for Swift 2.0 in Xcode 7.1
(Should work for Xcode 7 beta 4 and above)

You need to delete the text "Current Product Module" in Module!

2.
You should also follow the frequent recommendation to include

@objc(Show) 

just above your class.

Note: If you are using Xcode 7 beta 4 or later, this step is optional.

3.
Also make sure to cast the created managed object to the proper class, as the default would be just NSManagedObject.

var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show",                   inManagedObjectContext: context) as Show 


回答2:

SWIFT 2 / XCODE 7 Update:

This issue (see my April 3 comment on this answer as well) is resolved in Swift 2 and XCode 7 beta release by Apple. So you actually now do not need @objc(myEntity) in Swift as answered by Mundi or using "MyAppName." before your Class name. It will stop working. So remove these, just put Class name in File and select Current Working Module as Module and cheers!

But for those using @objc(myEntity) in Swift (like me), you can use this other solution instead which works smoothly.

In the xcdatamodel correct class in. It should look like this:

Here you go. Module.Class is the pattern for CoreData in Swift and XCode 6. You will also need the same procedure when using Custom Policy class in Model Policy or other CoreData stuff. A note: In image, The Name and Class should be Car and MyAppName.Car (or whatever the name of your entity). Here, User is a typo.



回答3:

When using Xcode 7 and purely Swift, I actually had to remove @objc(MyClass) from my auto-generated NSManagedObject subclass (generated from Editor > Create NSManagedObject Subclass...).



回答4:

In Xcode 7 beta 2 (and I believe 1), in the model configuration a new managed object of type File is set to the Module Current Product Module and the class of the object is shown in configuration as .File.

Deleting the module setting so it is blank, or removing the full stop so the class name in configuration is just File are equivalent actions, as each causes the other change. Saving this configuration will remove the error described.



回答5:

In Xcode 6.1.1 you do not need to add the @objc attribute since the base entity is a subset of an objc class (NSManagedObject) (see Swift Type Compatibility. In CoreData the full Module.Class name is required. Be aware the Module name is what is set in Build Settings -> Packaging -> Product Module Name. By default this is set to $(PRODUCT_NAME:c99extidentifier) which will be the Target's name.



回答6:

With xCode 7 and Swift 2.0 version, you don't need to add @objc(NameOfClass), just change the entity settings in "Show the Data Model Inspector" tab like below -

Name - "Your Entity Name"

Class - "Your Entity Name"

Module - "Current Product Module"

Code for Entity class file will be like (in my code Entity is Family) -

import UIKit import CoreData  class Family: NSManagedObject {     @NSManaged var member : AnyObject } 

This example is working fine in my app with xCode 7.0 + swift 2.0



回答7:

Do not forget to replace PRODUCT_MODULE_NAME with your product module name.

When a new entity is created, you need to go to the Data Model Inspector (last tab) and replace PRODUCT_MODULE_NAME with your module name, or it will result a class not found error when creating the persistent store coordinator.



回答8:

You also need to use (at least with Xcode 6.3.2) Module.Class when performing your cast for example: Assuming your module (i.e. product name) is Food and your class is Fruit

let myEntity =  NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext)  let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit 

Recap:

  • Include module name when defining entity in Data Model Editor (Name: Fruit, Class: Food.Fruit)
  • When accessing the entity in code (i.e.SWIFT), cast it with Module.class (e.g. Food.Fruit)


回答9:

Changing the Entity Class name in the Data Model editor to correspond to the class in question and adding @objc(NameOfClass) to file of each NSManagedObject right above the class declaration solved this problem for me during Unit Testing.



回答10:

I also encountered a similar problem, follow these steps to resolve:

  1. The parent is NSManagedObject, not NSObject
  2. The module of an entity is default, not "Current Product Module"


回答11:

What worked for me (Xcode 7.4, Swift) is changing the class name to . in the Entity inspector, 'Class' box.

My initiator of the Managed object subclass, looks like this:

    convenience init() {     let entityDescr = NSEntityDescription.entityForName("", inManagedObjectContext: )     self.init(entity: entityDescr!, insertIntoManagedObjectContext: )}     //init properties here 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!