1. ホーム
  2. multithreading

[解決済み] CoreData: 警告。という名前のクラスがロードできない

2023-01-22 02:28:31

質問

Xcode 6.1 を使用して、既存の Objective-C テレビ番組アプリを新しい Swift バージョンに複製していますが、CoreData でいくつかの問題があります。

私は 4 つのエンティティのモデルを作成し、それらの NSManagedObject サブクラスを (Swift で) 作成し、すべてのファイルに適切なアプリ ターゲットが (「ソースをコンパイルする」ために) 設定されています。

新しいエンティティを挿入しようとすると、まだこのエラーが発生します。

CoreData: 警告。Shows' という名前のクラスがエンティティ 'Shows' という名前のクラスをロードできません。 クラスが見つからないため、代わりにデフォルトの NSManagedObject を使用しています。

少しコメントします。

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 の実装の詳細が調整されている間、私たちが対処しなければならない奇妙な現象の 1 つです。警告は意図的に発生します。つまり、以下に概説するステップに従わない場合でも、セットアップはうまくいくかもしれません。

私はほとんどの場合、これを取り除くことができました。 クラスがモデルエディターで正しく設定されていることを確認することにより . 他の多くのSOF投稿(この質問に対する回答も含む)とは異なり、モジュール名を含めるという提案(例えば MyApp.Shows のように)モジュール名を含めるという提案には ではなく に助けられた。

この3つの項目を確認してください。

1.

Xcode 7 beta 3 まで動作するバージョン。

エンティティ名をより適切な単数形に修正したことに注意してください。

Xcode 7.1 の Swift 2.0 で動作するバージョンです。

(Xcode 7 beta 4 以上で動作するはずです)

Moduleの中の"Current Product Module"のテキストを削除する必要があります!

2.

また、頻繁に推奨されているように

@objc(Show)

あなたのクラスのすぐ上にある

注意 : Xcode 7 beta 4 以降を使用している場合、このステップは任意です。

3.

また、必ず キャスト を適切なクラスへキャストしてください。 NSManagedObject .

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