WWDCのAdvanced CloudKitとCloudKit Tips and Tricksを元に記事作成しています。
どのような時にコンフリクトが起きるのか?
レコードがロックされていないとき
0.初期状態
| Place |
Name |
Age |
| iCloud |
Paul |
20 |
| デバイスA |
Paul |
20 |
| デバイスB |
Paul |
20 |
1.デバイスAで変更発生
| Place |
Name |
Age |
| iCloud |
Paul |
20 |
| デバイスA |
John |
43 |
| デバイスB |
Paul |
20 |
2.iCloudに変更適応
| Place |
Name |
Age |
| iCloud |
John |
43 |
| デバイスA |
John |
43 |
| デバイスB |
Paul |
20 |
3.デバイスBで変更発生
| Place |
Name |
Age |
| iCloud |
Jonn |
43 |
| デバイスA |
John |
43 |
| デバイスB |
Ema |
20 |
4.iCloudへ適応
| Place |
Name |
Age |
| iCloud |
Ema |
43 |
| デバイスA |
John |
43 |
| デバイスB |
Ema |
20 |
コンフリクトは起きませんが、おかしなデータが出来上がります。
レコードがロックされている時
レコードの状態管理にはrecordChangeTagが使われます。
0.初期状態
| Place |
Name |
Age |
RecordChangeTag |
| iCloud |
Paul |
20 |
A |
| デバイスA |
Paul |
20 |
A |
| デバイスB |
Paul |
20 |
A |
1.デバイス1で変更発生
| Place |
Name |
Age |
RecordChangeTag |
| iCloud |
Paul |
20 |
A |
| デバイスA |
John |
43 |
A |
| デバイスB |
Paul |
20 |
A |
2.iCloudへ適応
| Place |
Name |
Age |
RecordChangeTag |
| iCloud |
John |
43 |
B |
| デバイスA |
John |
43 |
B |
| デバイスB |
Paul |
20 |
A |
iCloudとデバイス1のrecordChangeTagが同じなら変更可能。その後、新しいタグを生成
3.デバイス2で変更発生
| Place |
Name |
Age |
RecordChangeTag |
| iCloud |
John |
43 |
B |
| デバイスA |
John |
43 |
B |
| デバイスB |
Ema |
20 |
A |
4.コンフリクト!
iCloudのタグがBなのに対して、デバイス2のタグがAなのでコンフリクトが発生します。
Appleの見解
ほぼ全てでロックアップデートを使ってくれ。そしてコンフリクトの解決をしてくれ。
ロックしないのは以下のような場合:
・ 非常に激しい更新がある場合
・ ローカルの変更を強制したい時(ユーザーの選択によって)