2011-07-21 11 views
1

OK、ここに私の状況です:CoreDataマルチスレッド適切なストア削除

私はユーザーアカウントを必要とするアプリを持っています。 新しいコメントを書く、新しい投稿を作成する、スレッドを読むなどの作業をしている間は、サーバーへのすべての呼び出しは別のスレッドで実行されます。 具体的には、新しいスレッドが作成され、サーバーへの呼び出しが行われ、サーバーからの応答が取得され、回答のアイテムがコアデータストアに保存されます。

これを行うために、すべてのスレッドは独自のinsertionContextを作成しますが、すべて同じstoreCoordinatorを共有します。

しかし、一つ問題があります: 誰かが自分のアカウントからログアウトをしたとき、私は 、ストアを削除する必要があるので、彼は別のアカウントでログインしている場合、他のアカウントからのものはもうcoreDataStorageではありませんが。

しかし、ストアを削除するには、バックグラウンドスレッドがもう実行されていないことを確認する必要があります。これは、一度ストアの内容を保存しようとすると、ストアが無効であるためですもう有効ではありません。 明確にする:これらのバックグラウンドスレッドは、NSOperationQueueに配置されてそこから実行されるNSOperationsです。

今CoreData iは がどのように私はこれまでのところ、このキャンセルメッセージO_O を使用しない... NSOperationQueue「をcancelAllOperations」と呼ばれる機能を提供しますが、ドキュメントによると、実行中の操作は殺されていないが、唯一のキャンセルメッセージを送信します私のスレッドがキャンセルされたかどうかをいくつかの点でチェックm」は、それがある場合、私は他のものを実行しませんが、私は次のようなものを行う場合:

NSError *saveError = nil; 
if(!self.isCanceled) 
    [insertionContext save:&saveError]; 

スレッドが間にキャンセルされている可能性がまだありますif-checkとsaveを実行します。

だから私の質問: これを正しく処理するにはどうすればよいですか?それはスレッドを適切にキャンセルすることの問題ですか?

答えて

0

スレッドをすぐにkillしないため、操作をキャンセルしないでください。なぜ現在実行中のすべての操作を管理しないのですか?これにより、すべてのタスクが完了するまで永続的なストアの削除を延期することができます(または、進行中の操作がない場合は直ちに削除します)。

+0

この問題は、まだ開始されていない操作は、データが必要ないため、完全に不要であるにもかかわらず開始されます。 また、私はそれらがインターネットからのものをダウンロードするのを待たなければならないでしょう...それは永遠に取ることができます – Infinite

関連する問題