Core Data が NSManagedObjectId を主キーにすることは知っています。
さて、このようなシーンでは、msgId はメッセージ レコードに対して一意です。
Thread A
msgId 1001 のメッセージをコンテキストに挿入しようとします。挿入の前に、キーと値thread A
でメッセージを見つけようとしました。何も見つからなかったため、挿入アクションを実行します。msgId
1001
その間、Thread B
msgId を使用してメッセージに対して同じことを行っています1001
。
では、その時として -------------->
Thread A
: 検索 --> 挿入 --> 保存
Thread B
: 検索 --> 挿入 --> 保存
スレッド A とスレッド B の両方に独自のコンテキストがあり、検索、挿入、保存するため、msgId を含むメッセージが1001
2 回挿入され、ディスクに繰り返し保存される可能性があります。
この問題を回避するために、シリアル キューを使用して 1 つずつ操作DISPATCH_QUEUE_SERIAL
を行うことができるかもしれません。find-insert-save
しかし、主キーなど、それを行う他の方法があるのだろうか?はい、Core Data がデータベースではなく、オブジェクトグラフであることは知っています。
ありがとう。