0

以前は、 Apple askとして coredata をNSManagedObjectContextスレッドごとに 1 つ使用NSNotificationCenterし、 を観察してからNSManagedObjectContextDidSaveNotification変更を元にマージしていました。Apple は、サンプル コードで正しい方法を示しています。

ただし、これは少し冗長であり、機能させるには大量のコードを作成する必要があります。iOS 5 には、新しいメソッドperformBlock:と. すべてのスレッドに1 つのスレッドを渡したり、すべてのコアデータ関連コードを使用またはラップしたりできるようになりました。これははるかに簡単で頭痛の種が少ないはずですが、Apple 自身でさえ、この新しい方法についてはあまり話さなかったようです。 iOS ドキュメントの「Concurrency with Core Data」の章と「ThreadedCoreData」サンプル コードでは、スレッドごとに 1 つを推奨しています。performBlockAndWait:NSManagedObjectContextNSManagedObjectContextperformBlock:performBlockAndWait:NSManagedObjectContext

だから私は疑問に思ってperformBlock(AndWait):います、人々がそれを使わないようにするための欠点はありますか? または、私が言った「新しい方法」は単に悪い設計ですか?

4

2 に答える 2

2

NSManagedObjectContext実際には、スレッドごとに 1 つしか持てないのは事実です。

これを注意深く読んだら:

プライベート キュー (NSPrivateQueueConcurrencyType)。

コンテキストは、プライベート キューを作成および管理します。コンテキストが関連付けられているスレッドまたはキューを作成して管理する代わりに、ここではコンテキストがキューを所有し、すべての詳細を管理します (以下で説明するブロックベースのメソッドを使用する場合)。

これは、NSPrivateQueueConcurrencyTypeコンテキストが操作キューも処理することを意味しますが、そのコンテキストを異なるスレッド間で共有することはできません。これは、UI からコンテキストにアクセスする必要がある場合に特に関連します。これには、 type の 2 つ目のコンテキストが必要になりますNSMainQueueConcurrencyType

performBlock:そのため、コア データへのマルチスレッド アクセスに関して、新しいおよびperformBlockAndWait:操作が容易になるケースがあるかもしれません(たとえば、リモート データを取得してデータベースを更新する長時間実行タスク)。スレッドごとのコンテキスト。

醜い驚きを避けるために、これを明確にしておく方がよいと思います。

変更のマージに関しては、古い制限モデル (スレッドまたは操作キューを処理する) を使用するか、変更を子コンテキストから親にプッシュするNSManagedObjectContextDidSaveNotification新しい親子コンテキスト関係を使用できます。saveContext(親子のコンテキストについてコメントしてくれた flexaddicted に感謝します)。

于 2013-01-08T09:08:54.743 に答える
0

シングルNSManagedObjectContextをすべてのスレッドに渡し、関連するすべてのコアデータを使用performBlock:またはperformBlockAndWait:ラップできるようになりました

これはどういう意味ですか?新しい Core Data の目標は、とりわけ、クライアント レベルでの変更を親に直接簡単にプルできる親子関係を作成することです。各スレッドには独自のコンテキストがあります。明らかにNSManagedObjects に関する制限は残ります。スレッド間でオブジェクトを共有する必要がある場合は、それらNSManagedObjectIDの を共有する必要があります。

以前のアプローチと異なる点は、performBlock(およびその同期バージョン) を使用すると、スレッド化された環境について心配する必要がないことです。それらを使用して何かを行うと、Core Data があなたに代わって物事を管理します。

たとえば、あなたの質問については、コードの再編成が必要なため、古い Core Data プロジェクトでは新しいものを使用していません。明らかに、これはプロジェクトの規模に厳密に依存します。ただし、新しいプロジェクトを開始する場合は、それらを試してください。彼らは非常に挑戦的です!

于 2013-01-08T09:20:23.220 に答える