私はあなたの問題を本当に理解していません。NSManagedObjectから継承するクラスを公開する場合、そのクラスのユーザーには、付随する問題とともにその面付けがあります。
クラスをコンポジションとして公開する場合、管理対象オブジェクトの詳細はクラス内にあり、それらの詳細は簡単に非表示にできます。
必要なときにMOCを作成/破棄できますが、かなり安価です。しかし、それはあまり有益ではないようです。
インターフェイスに使用する単一の管理対象オブジェクトコンテキストを保持することをお勧めします。複数のスレッドがMOCを呼び出すことを心配しているとおっしゃいました。これは有効な懸念事項ですが、NSPrivateQueueConcurrencyTypeでMOCを使用することにより、簡単かつ効率的に克服できます。
そうすれば、オブジェクトをフェッチする必要があるときはいつでも、
[moc performBlockAndWait:^{
// Fetch the object from the MOC
}];
デッドロックが発生する可能性があるため、同期バージョンの呼び出しには注意してください。
または、フェッチごとに一意のコンテキストを作成するオプションを引き続き使用できます...
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
moc.parentContext = myPrivateQueueContext;
// Now, you can fetch from this MOC, and do what you want with the object
// and when you are done, you just let the MOC dealloc.
NSFetchRequestのオプション、およびMOC自体の設定(具体的には)を確認することをお勧めします。
refreshObject:mergeChanges:
retainsRegisteredObjects
myPrivateQueueContextにオブジェクトを保持するように指示すると、オブジェクトはローカルMOCに保持されます。次に、フェッチを実行するときに、MOCにキャッシュされたバージョンを優先するようにフェッチに指示できます。これにより、ディスクに移動することもありません。
管理対象オブジェクトのobjectIDを保存し、objectRegisteredForID:を呼び出すだけで、さらに利点を得ることができます。これは、すでに登録されているオブジェクトを検索するだけです。答えに反対票を投じた人は誰でも手動でキャッシュをクリーンアップできるので、必要に応じてキャッシュが大きくなりすぎないようにします。
または、existingObjectWithID:error:を呼び出すことができます。これにより、障害が返されることはありません。結果は常に実現されたオブジェクトまたはnilになります。
とにかく、やりたいことはいろいろな方法で簡単に解決できると思います。ただし、ソリューションを過度に設計しないように注意します。
公開するインターフェースを見つけて、それを実装します。後でパフォーマンスの問題を発見した場合は、その時点で対処してください。
** 編集 **
具体的には、ダンラのコメント(および回答に反対票を投じた人)に対処するためです。私はあなたがプライベートMOCから直接データにアクセスすることを意図していませんでした。プライベートMOCにアクセスする場合は、performBlockを使用します。
ただし、任意の同時実行タイプの子を必要な数だけ作成し、それらを心の希望に合わせて使用することができます。データベースと通信する必要がある場合は、(適切なコンテキストで)親と直接通信します。
私が言ったことは、プライベートMOCで何かをすることを示唆していませんが、performBlockを呼び出すか、別のMOCの親にします。