2

わかりました、私は理解するのに何日も費やした非常にトリッキーな問題を抱えており、それを修正する方法がわからないことを知っています.

異なるコンテキストで別のスレッドから更新された 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

この疑似コードの例では、process1 と process2 は問題なく動作しますが、メイン スレッドが重複する更新イベントを受け取り、process3 が完了する前に process4 がデータベースの読み取りを開始することがあります。

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

ありがとう

4

1 に答える 1

2

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

プロセス 3 とプロセス 4 がメイン スレッドで実行されている場合、3 が終了する前にプロセス 4 を開始するにはどうすればよいでしょうか? 通知は、それらを投稿するスレッドで受信されることを忘れないでください。そのため、コードを明示的に実行して、メイン スレッドで変更をマージする必要があります (明白なことを述べている場合は申し訳ありません)。

于 2011-02-02T11:26:47.437 に答える