3

コアデータをマルチスレッド化するためのAppleの推奨方法は、スレッドごとに管理対象オブジェクトコンテキストを使用し、変更されたスレッドのコンテキストを共有永続ストアに保存することで、あるコンテキストから別のコンテキストに変更を送信することです。

私はそれがうまくいくことを想像することができますが、例えば。RSSリーダー、一部のアプリケーションでは、理想からはほど遠いようです。私の場合、バックグラウンドスレッドを使用してデータを記録および再生するミュージックシーケンサーを作成しています。記録/再生中にメインスレッドにアクセスできるように、記録されたデータが必要です。記録/再生中に常にデータを保存およびロードしなければならないことは十分に悪いことですが、さらに悪いことに、ユーザーが記録または再生するたびに保存を強制するように思われ、「ひどいアプリケーション」と叫びます。

ただし、これを回避する方法があるようです。他のスレッドがコアデータエンティティ自体(それらに含まれるデータのみ)にアクセスする必要がない場合、管理対象オブジェクトコンテキストを独自のスレッドで実行し、UIをバインドするなどして他のスレッドに間接アクセスのみを許可するのを防ぐにはどうすればよいですか?performSelector:onThread:withObject:waitUntilDone:管理対象オブジェクトコンテキストのスレッドを呼び出して値を取得/設定するプロパティへのオブジェクト?

マルチスレッド(つまり、コアデータをマルチコアCPUにスケーリングする)の利点の一部は提供されませんが、多くの場合、集中的な処理が行われているときにUIがロックされないようにマルチスレッドが必要です。

このパターンがコアデータに推奨されているのを見たことがありません。アップルが提案することを正確に行わないと、奇妙で​​予測不可能な獣になる可能性があることを考えると、複数のスレッドが単一の管理対象オブジェクトコンテキストにアクセスすることを思いとどまらせる理由を本当に回避できるかどうかを尋ねる価値があると思いました。

4

1 に答える 1

2

NSManagedObject の内部の実装の詳細を制御することはできません。具体的には、属性を読み取るときに CoreData がコンテキストで何かを行う必要がある場合がある理由があります。

特定のニーズについては、CD オブジェクトから必要なものをコピーしてからバックグラウンド処理スレッドに渡す、高度に最適化された分離されたバッファーとキュー ベースのソリューションをお勧めします。


必要に応じて performSelector:on*Thread: を使用できますが、その場合、同期の問題、レイテンシー、およびその他の興味深い同時実行の問題に対処する必要があります。個人的には、上記のキューイング メカニズムを使用します。

于 2010-10-01T00:50:34.323 に答える