2

私はそれを修正する方法がわかりません。NSManagedObjectContextDidSaveNotificationイベントをオーバーラップさせないようにする

異なるコンテキストの異なるスレッドからCoreDataデータベースを更新しました。私の問題は時々NSManagedObjectContextDidSaveNotificationイベントが重複し、クラッシュにつながるベースの破損を作成することです。次に例を示します。

Thread     Main           NSFetchResultsController 

Update database 
Save database   NSManagedObjectContextDidSaveNotification1 
         merge           delegate process 1 
                     process 1 done 

Update database 
Save database   NSManagedObjectContextDidSaveNotification2 
         merge           delegate process 2 
                     process 2 done 
Update database 
Save database   NSManagedObjectContextDidSaveNotification3 
         merge           delegate process 3 

Update database 
Save database   NSManagedObjectContextDidSaveNotification4 
         merge   

                     process 3 done 
                     delegate process 4 
                     CRASH 
                     process 4 done 

この擬似コード例のプロセス1とプロセス2が問題 せずに動作しますが、時には、メインスレッドが更新イベントが重複して あなたがprocess3が行われる前に、データベースを読み始めprocess4ている受信で。

これに対処する正式な方法はありますか? CoreDataはこの状況に対して の解決策を提供していますか、NSLockを使用する必要がありますか?

おかげ

+0

マージ通知を処理するコードの部分を投稿できますか?それがなければ誰も推測できないと思う。私が答えて言ったように、コンテキストは永続的なストアコーディネーターを連動させてアクセスを連鎖させてしまうので、こうした問題を防ぐことができます。 – paulbailey

答えて

2

コンテキストは、彼らがこれらの問題を防ぐために共有し、永続ストアコーディネータをロックする必要があります。

プロセス3とプロセス4がメインスレッドで実行されている場合、どのようにして3が開始されるのですか?ポストするスレッドで通知が受信されることを忘れないでください。明示的にコードを実行してメインスレッドで変更をマージする必要があります。

+0

ご意見ありがとうございます。 NSFetchResultsControllerが関わっているので、私はこれがもっと複​​雑であることが判明したので私の質問を更新しました。何とかNSFetchResultsControllerDelegateが最後の更新を処理しているときにデータベースが更新されることがありますが、これは問題を引き起こします – CodeFlakes

+1

コントローラとその代理人は赤いニシンだと思います。その活動はメインスレッド上で行われるはずです。このようなクラッシュは、コンテキストを作成したスレッド以外のスレッドからコンテキストが使用されているため、ほぼ常に発生します。 – paulbailey

関連する問題