multithreading - 核心数据 : warning: Unable to load class named

标签 multithreading core-data swift nsmanagedobject

我正在使用 Xcode 6.1 将现有的 Objective-C 电视节目应用程序复制到新的 Swift 版本,但我遇到了一些 CoreData 问题。

我创建了一个包含 4 个实体的模型,创建了它们的 NSManagedObject 子类(在 Swift 中),并且所有文件都设置了正确的应用程序目标(用于“编译源”)。

每当我尝试插入新实体时,我仍然会收到此错误:

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

一些评论:

保存到 Core Data 时,我使用父子上下文方式来允许后台线程。我通过使用以下方法设置 ManagedObjectContext 来做到这一点:

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

并通过以下方式保存数据:

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

最佳答案

这个警告是我们在解决 Swift 实现细节时必须处理的问题之一。警告是虚假出现的,即即使您不遵循下面概述的步骤,您的设置也可能正常工作。

通过确保在模型编辑器中正确设置类,在大多数情况下我已经能够摆脱它。与许多其他 SOF 帖子(包括对这个问题的回答)不同,包含模块名称(如 MyApp.Shows)的建议没有对我有帮助。

确保检查这三项:

1.
适用于 Xcode 7 beta 3 的版本

Up to XCode7 b3

请注意,我已将您的实体名称更正为更合适的单数形式。

适用于 Xcode 7.1 中的 Swift 2.0 的版本
(应该适用于 Xcode 7 beta 4 及更高版本)

您需要删除Module中的文本“Current Product Module”!

From Xcode7 beta 3

2.
您还应该遵循常见的建议,包括

@objc(Show)

就在你的类(class)之上。

注意:如果您使用的是 Xcode 7 beta 4 或更高版本,则此步骤是可选的。

3.
还要确保将创建的托管对象转换到正确的类,因为默认值只是NSManagedObject

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

关于multithreading - 核心数据 : warning: Unable to load class named,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613971/

相关文章:

multithreading - delphi中如何释放线程

swift 核心数据 fatal error : unexpectedly found nil while unwrapping an Optional value

ios - 从 Swift 函数中的异步调用返回数据

ios - TableView 自动重新排序

objective-c - Swift:在 Swift 中使用在 Objective-C 中声明的枚举时遇到问题

java - 更改ThreadPoolExecutor

java - 使用线程进行堆排序

java - 多线程访问内存

objective-c - 如何使用不同的主键属性更新 RestKit 中的已发布对象?

iphone - cocoa touch : When does an NSFetchedResultsController become necessary to manage a Core Data fetch?