現在、CloudKit Frameworkの使用方法を学習していますが、Core DataとCloudKitを同期する方法を示すドキュメントや例が不足しています。
CloudKit専用のすべてのWWDCビデオ(2014、2015、2016)を視聴しましたが、Core Dataとの同期の実装方法を説明するものはありません。この同期を実装する方法を示す、新しい例、チュートリアル、または書籍が見つかりません。
CloudKitのOperations API(Convenience APIではない)を使用し、CloudKit専用の新しいWWDC 2016ビデオで述べたように変更をサブスクライブすることが効果的であることを知っていますが、CoreDataとのマッピングは本当の問題です。
たとえば、Notesアプリに似たアプリを作成したいとします。ユーザーはオフラインでメモを作成し、それらを操作して、コアデータデータベースに保存できます。デバイスがオンラインになると、アプリはサーバー上の変更を確認し、新しく作成されたレコードをサーバー(CloudKit)に保存します。
アプリが起動すると、CloudKitから変更も取得し、変更があれば、ローカルキャッシュ(コアデータ)を新しい変更で更新します。
同期の一般的なパターンがあればありがたいです。 Core Dataメソッドとの同期をどこに配置し、どのように見えるか?
これに関する情報やヘルプをいただければ幸いです。
私はSwift 3、Xcode 8、iOS 10。
Core DataはすでにiCloudに同期する機能をユーザーに提供しています。 CloudKitを使用する必要はありません。
しかし、はい、iCloudでのCore Dataは廃止されました。それでも、 廃止されていません があり、Appleを中止するための即時計画はありません。彼らはその使用を思いとどまらせたいだけですが、問題もあります。複数のデバイスからの更新を合理化する。
いずれにせよ、私はクラウドキットを使用してこれをどのように行うかという問題を自分自身で調査してきました。 2つの答え。 1つ目は、次を使用することです。
2つ目は、手動で行うことです。
ここで重要なのは、Cloud Kitがレコードの更新を確実に処理するためにレコードメタデータを必要とするため、そのメタデータをCore Dataデータベースに保存する必要があるということです。 CKRecord クラスにはメソッド encodeSystemFields(with:) が含まれており、これらのフィールドをデータベースに保存できるデータレコードにエンコードし、適切なデコーダーを使用できますCKRecordを復元する必要がある場合。
とにかく、私はこれを自分でやろうとしています。入手したら、詳細を更新してこれを更新します。
Appleは最近、この質問に答えていると思われるガイドを公開しました。 Appleの CloudKitレコードのローカルキャッシュの維持 をチェックして、デバイスにCloudKitデータを保存する方法を確認してください。
このガイドは、デバイスに書き込むためのサンプルコードを提供していませんが、残りの質問には答えています。これにより、CloudKitから変更を取得し、デバイスに保存できるデータを作成する方法がわかります。
IOS 13では、開発者向けにこの同期を簡素化する新しいAPIがあります。 CoreDataとCloudKitの間の新しい同期についてのWWDC19セッションをご覧になることをお勧めします。これらの新しいAPIはiOS 13以降でのみ機能することに注意してください。
ビデオ: https://developer.Apple.com/videos/play/wwdc2019/202/
つまり、NSPersistentCloudKitContainer
の代わりにNSPersistentContainer
の使用を開始する必要があります。これにより、最後のライターが勝つマージ戦略を使用した自動競合解決を使用して、同期が自動的に機能します。正常に機能するアプリを作成する場合は、アプリの同期を改善するためにいくつかの変更も行う必要があります。
公式ドキュメントは次の場所にあります。
コラボレーションのデータモデリング(競合のない複製されたデータ型)
セッションの終わりに、彼らはデフォルトの「last-writer-wins merge strategy」よりも優れた同期マージの例を示しました。 Causal Treesを使用すると、複数のユーザーがデータを失うことなく、同じ文字列を編集できます(他の種類のデータを拡張できます)。この仕組みと実装方法(CloudKitでも)を説明しているArchagonのこの記事を読むことを本当にお勧めします。同期されますが、新しい自動同期は行われません)。セッションで示したように、CoreDataとCloudKit間の新しい自動同期を使用してこれを実装することもできます。