0

コアデータを使用したiphone/ipadアプリケーションがあります。 データは、さまざまなWebサービスコールを介して提供されます。 私は情報を最新の状態に保つために、ポーリングメカニズムを使用して、サービスコールのそれぞれがいつ行われるかを決定します。 このように、複数のMOCを使用してこれらの呼び出しからのデータを処理する複数のバックグラウンドスレッドが非常によくあるかもしれません。挿入と更新の場合、このアプローチはうまく機能します。 削除機能を実装しようとすると、プログラムがクラッシュします。これは、削除されたオブジェクトにフォールトが発生しているため、あるスレッドのコンテキストが別のスレッドも処理している管理対象オブジェクトを削除した場合に発生していると考えられます。複数の背景スレッドを持つコアデータ

私は解決策をオンラインで探していましたが、特に何かに着手していませんでした。 削除をメインスレッドのコンテキストにプッシュする必要がありますか?すべての処理を行うためにシングルスレッドとそれに付随するMOCをシングルトンで維持するのはどうでしょうか?

ご協力いただきありがとうございます。

答えて

1

私は解決策をオンラインで探していましたが、特に何かには到着しませんでした。

Core Data Programming GuideでAppleが提案したすべてを試しましたか?あなたのコードを見ることなく、あなたが欠けているビットはNSManagedObjectContextDidSaveNotification部分です。各スレッドは、他のスレッドにMOCセーブを登録する必要があります。これは、スレッドにはすべて実行ループが必要であることを意味します。

全体的にみると少しばかり見えます。私は主なスレッド(削除だけでなく)ですべてのコアデータの変更を行うようにアーキテクチャを変更すると思います。

+0

AppDelegate didFinishLaunchingWithOptionsメソッドで: [[NSNotificationCenter defaultCenter] addObserver:自己セレクタ:@selector(changesSaved :) name:NSManagedObjectContextDidSaveNotificationオブジェクト:なし];
これは、呼び出し:
- (ボイド)changesSaved:(NSNotification *)注 {[自己performSelectorOnMainThread:@selector(changesSavedOnMainThread :) withObject:waitUntilDone注意:YES]を。 }
最後に、
- (ボイド)changesSavedOnMainThread:(NSNotification *)注 {\t IF([ノートオブジェクト]!= __managedObjectContext)[__managedObjectContext mergeChangesFromContextDidSaveNotification:note]; } – flizit

+0

申し訳ありませんが、上記のコメントはひどいです。とにかく、私は理論的にメインスレッドを可能な限りフリーに保つために、この処理をバックグラウンドにしました。私は間違いなく、メインスレッドでの処理とバックグラウンドでの処理のどちらがパフォーマンスにどのような影響を与えるかを見て調整することができます。 – flizit

2

同じアプリケーションの部分間で共有されているデータセットに同時にアクセスして、フラッギングオブジェクトを実際に削除する前に廃止されたものとして使用すると便利です。

これにより、不要なデータの要求をキャッチして適切に対応できるようになります。

通常、すべてのアクセスを処理するデータ・マネージャ・シングルトン・クラスがあります。フラグは、オブジェクトへの最後のアクセスをマークする、エンティティに対するタイムスタンプ属性であってもよい。フラグされたオブジェクトの実際の削除は、他の要求が待ち行列になく、オブジェクトが一定の時間使用されていない間に発生します。

データの種類と量、および変更の頻度によっては、このアプローチでは洗練が必要な場合があります。

+0

ご返信ありがとうございます。私はこのタイプの実装を管理するために多くのコードを追加しなければならないのではないかと心配していますが、うまくいくと思います。 – flizit

関連する問題