私はiCloudの実用的な実装を持っています。ここで、いくつかのマージ機能を追加して競合処理を改善したいと考えています。テスト目的で競合を強制する一貫した方法を考え出そうとしていますが、これまでのところ運が悪く、競合が発生すると予想されるときに一貫して発生しません。これは、私が何か間違ったことをしていることを示しているのかもしれませんし、iCloud の仕組みについて何か誤解していたのかもしれません (つまり、別のことです)。
私は UIDocument を使用しています。はい、UIDocumentStateChangedNotification をリッスンしています。実際、私は時折競合の通知を受け取ります。また、iCloudにはファイルが1つしかありません。
同じ iCloud アカウントを使用する 2 つのデバイスがある場合、常に競合が発生すると予想していたイベントの流れは次のとおりです。
- 両方のデバイスでファイルを開きます (両方のデバイスで同じコンテンツが正しく表示されるようになりました)。注:ここで openWithCompletionHandler が呼び出されるのは 1 回だけです。その後は二度と呼び出されません。
- デバイス A に変更を加えて、saveToURL を呼び出します。
- 変更が反映されるまでしばらく待ちます。
- デバイス B でその他の変更を行い、saveToURL を呼び出します。
- 変更が反映されるまでしばらく待ちます。
- 予想:アプリは iCloud から競合の通知を受け取るはずです。監視:競合は非常にまれに発生しますが、ほとんどの場合、UIDocument が UIDocumentStateEditingDisabled フラグを設定し、0.5 秒ほど後にクリアするだけです (iCloud デーモンが動作している間は編集が無効になっていると思います)。他のデバイスからバージョンを取得し、ローカルのユビキタス ディレクトリに保存します)。
SVN のようなバージョン管理システムと同じように、デバイス A によってアップロードされたバージョンを取得するには「更新」が必要なため、デバイス B からのバージョンが競合を引き起こすと予想していました。
今説明したシナリオで競合が発生すると予想するのは間違っていますか? なんで?一貫して競合を強制する他の方法はありますか?
ありがとう!