私は、iPhoneアプリケーションに保存されているコアデータをiPadやMacなどの複数のデバイス間で同期する方法に取り組んでいます。iOSのCoreDataで使用する同期フレームワークは(あるとしても)多くありません。しかし、私は次の概念について考えてきました。
- ローカルコアデータストアに変更が加えられ、変更が保存されます。(a)デバイスがオンラインの場合、変更セットを送信したデバイスのデバイスIDを含め、変更セットをサーバーに送信しようとします。(b)チェンジセットがサーバーに到達しない場合、またはデバイスがオンラインでない場合、アプリは変更セットをキューに追加して、オンラインになったときに送信します。
- クラウドにあるサーバーは、受け取った特定の変更セットをマスターデータベースとマージします。
- 変更セット(または変更セットのキュー)がクラウドサーバーにマージされた後、サーバーは、ある種のポーリングシステムを使用して、サーバーに登録されている他のデバイスにそれらの変更セットをすべてプッシュします。(私はAppleのプッシュサービスを使用することを考えましたが、コメントによると、これは実行可能なシステムではないようです。)
私が考える必要がある何か空想はありますか?ObjectiveResource、Core Resource、RestfulCoreDataなどのRESTフレームワークを見てきました。もちろん、これらはすべてRuby on Railsで動作しますが、私はこれに縛られていませんが、ここから始めることができます。私のソリューションに対する主な要件は次のとおりです。
- 変更は、メインスレッドを一時停止せずにバックグラウンドで送信する必要があります。
- 使用する帯域幅はできるだけ少なくする必要があります。
私はいくつかの課題について考えてきました。
- さまざまなデバイス上のさまざまなデータストアのオブジェクトIDがサーバーに接続されていることを確認してください。つまり、データベースに格納されているオブジェクトへの参照を介して関連付けられたオブジェクトIDとデバイスIDのテーブルがあります。レコード(DatabaseId [このテーブルに固有]、ObjectId [データベース全体のアイテムに固有]、Datafield1、Datafield2)があり、ObjectIdフィールドは別のテーブルAllObjects:(ObjectId、DeviceId、DeviceObjectId)を参照します。次に、デバイスが変更セットをプッシュすると、ローカルデータストアのコアデータオブジェクトからデバイスIDとobjectIdが渡されます。次に、クラウドサーバーはAllObjectsテーブルのobjectIdとデバイスIDをチェックし、初期テーブルで変更するレコードを見つけます。
- マージできるように、すべての変更にタイムスタンプを付ける必要があります。
- デバイスは、バッテリーを使いすぎずにサーバーをポーリングする必要があります。
- サーバーから変更を受信した場合、ローカルデバイスは、メモリに保持されているものをすべて更新する必要があります。
私がここで見逃しているものは他にありますか?これを可能にするには、どのようなフレームワークを検討する必要がありますか?