2017-05-19 6 views
1

最近、NSManagedObjectサブクラスがクラスのメソッドentityを継承し、クラスのNSEntityDescriptionを取得することが分かりました。しかし、entityForName:inManagedObjectContext:のように、NSEntityDescriptionを作成するときにコンテキストを指定する必要がありました。より簡単なentityメソッドを使用しても問題ありません。どのコンテキストに関連付けるのですか?NSManagedObjectエンティティクラスメソッド

この方法はAppleによって文書化されたnot reallyです。

+0

どの言語とiOSバージョンですか? (タグを追加してください) – shallowThought

+0

コンテキストを指定せずにNSManagedObjectを作成できる方法はわかりません。エンティティは、NSManagedObjectが作成されたコンテキストに関係していると思います。 – Spads

+0

これはクラスメソッドであるため、NSManagedObjectに関連付けられていません。 – vib

答えて

1

NSEntityDescriptionは、管理対象オブジェクトの一部ではありません。管理対象オブジェクトモデルの一部です。

データモデルを読み込むと、そこに含まれるすべてのエンティティの説明が読み込まれます。クラスメソッド+entityは、エンティティ記述がモデルオブジェクトとともに作成されたために機能します。このメソッドをと呼び出そうとすると、モデルがロードされる前にがObjective-Cにnilを返します。 (何らかの理由でSwiftでは何も返されないので、ゼロではありませんが、使用するとアプリがクラッシュします)。

+entityForName:inManagedObjectContext:、あなたが言ったように。ただし、そのメソッドのドキュメントを参照してください。

指定された管理対象オブジェクトコンテキストの永続ストアコーディネーターに関連付けられた管理対象オブジェクトモデルから、指定された名前のエンティティを返します。

したがって、このメソッドは管理対象オブジェクトのコンテキスト引数を取りますが、それでも管理対象オブジェクトモデルを使用しています。コンテキストを使用してモデルを検索しています。取得するオブジェクトはコンテキストに関連付けられていないため、基礎となるデータモデルに関連付けられています。

これらの2つの方法は同じように安全です。あなたのコードで一番うまく動作するものを使用してください。

+0

「モデルをロードする前にこのメソッドを呼び出そうとした場合」:典型的なiosの使用法でモデルがロードされているのはいつですか? – vib

+0

エンティティがメモリにロードされたことを定義するNSManagedObjectModelの前に[EntityName entity]を呼び出そうとすると、この方法はまだ存在しますが、エンティティ情報はまだありません。 'NSPersistentContainer'を使うと、モデルは' loadPersistentStores(completionHandler:) 'を呼び出すときにロードされます。あなたが 'NSPersistentContainer'を使用していないなら、特にNSManagedObjectModelをどこかに作成するコードを持っています。 –