2016-10-14 26 views
3

私は、コアデータを使用してスウィフト2でアプリを作成しました。私は、クラウド内でも機能を追加することを考えています。私はRealmとCloudKitについてのチュートリアルを読んだことがありますが、コアデータの上(またはそれに沿って)でそれらを使用することについての素晴らしい例は見ていません。コアデータをクラウドに使用するiOSアプリを同期する

私がしたい:

  1. は、ユーザーが一度自分のデータを入力し、それがすべてのデバイスに表示されていすることができます。
  2. ユーザーは、自分のデータの一部を選択したユーザーと同期させることができます。

CloudKit(またはその他のフレームワーク)を使用してCRUD操作中にCore Dataロジックをすべて保持し、いくつかのサーバーコールを追加することはできますか?たとえば、いくつかのテーブルにNSFetchedResultsControllerを使用していますが、CloudKitを使用している間も引き続き使用することは理にかなっていますか?

答えて

12

CloudKitCoreDataは自動的に一緒にシームレスに動作するわけではありませんので、自分でロジックを書き込む必要があります。

different types of iCloud storage options 1つまたは2つがありますがシームレスにCoreDataと統合んが、CloudKitはそのうちの一つではない、とCloudKitは、あなたが他の人とデータを共有するユーザーを有効にするの願望を持っている場合は、あなたが使用する必要がありますものです。

AKA:あなたは重労働をする必要がありますが、優れた設計方法を使用する場合は、既存のコードの多くを書き直すことなく作業を1回行うことができます。

だから、ここで私は両方のフレームワークを使用した私のプロジェクトの一つに何をしたかのようなものです:

  • あなたはほぼ確実に、すでに持っているようにコアデータ・オブジェクト・モデルとNSManagedObjectサブクラスを作成します。 Xcodeプロジェクト能力のCloudKit上

  • 電源を入れて、あなたのレコードモデルは、あなたのコアデータのエンティティモデルをモデルにした(戻るXcodeで)

  • を設計する

  • 使用CloudKitダッシュボード

  • CloudKitダッシュボードにログインメソッドを作成します。特定のCore Dataオブジェクトを CKRecordから作成する方法を知っていて、Core Dataオブジェクトから CKRecordを作成する方法を知っているどこかで(最も便利には、 NSManagedObjectサブクラスの拡張として)

  • CloudKitレコードを処理するための専用の1つ以上のSwiftクラスを作成し、コアデータと同期させます。このクラスはフェッチ、追加、削除、変更など、すべてのCloudKit操作を高いレベルで実行する責任があります。必要に応じてこのパブリックAPIを設計できます(ニーズに合わせてカスタマイズする必要があります)。クラスでは、前の手順で作成したメソッドを使用して、コアデータ型との間で変換する可能性が最も高くなります。このアプローチで

、クラスを専門にあなたのCloudKitは(私たちはCloudBrainそれを呼ぶことにします)重い物を持ち上げるのすべてを行い、あなたがしたい場合、あなたはそれが舞台裏でそれをすべて行うことができます。たとえば、コアデータマネージドオブジェクトコンテキストの変更を自動的にリッスンする別のクラスSyncBrainを定義し、CloudBrainの対応するメソッドを呼び出して、すべての変更がiCloudと同期されていることを確認できます。また逆もあり、iCloudの変更をリッスンしてCore Dataに適用する必要があります。これには当初、変更を最初にCloudBrainから取得する必要があります。また、リアルタイム更新については、CKSubscriptionを調べることも必要です。

このアプローチの美しさは、他のクラスがコアデータとやりとりするたびに、コアのすべての変更が自動的に確実に行われるように、すべてのコードを同じにしておくことですデータはiCloudに反映され、その逆も同様です。

他のユーザーと共有する場合、この機能はiOS 10の新機能で、AppleがまだCloudKit Quick Startを更新したようには見えません。したがって、今年はWWDCからWhat's New with CloudKitを視聴する必要があります。

重要なお知らせ:CloudKit Dashboardでレコードモデルを設計する場合は、iCloud Design Guideに従い、子レコードタイプの配列を保持するフィールドを持つ親レコードタイプを持たないようにしてください。これは素晴らしいパフォーマンスではありません。代わりに、親レコードを指す単一のCKReferenceフィールドを持つように子レコードタイプを定義します。そうすれば、親に子供が必要な場合は、親を持つすべてのオブジェクトをあなたが望む親に設定するように要求するクエリを作成することができます(必要なときにすべての子をダウンロードするのを待つのではなく親)。

ここにはいくつかのWWDCセッションがあります。古いセッションには依然として非常に有用な情報が含まれていますが、一部のセッションには期限が切れています。

+0

本当に助けになりました。私はおそらくそのルートに行くでしょう。私自身のロジックを記述し、 "汚い"データを追跡する必要がありますか?たとえば、ユーザーが時刻TにデバイスAのデータを入力した場合、最後の更新時刻がT-1のデバイスBのアプリを開き、T-1以降のすべての入力に対してiCloudからプルを行いますか? – Coder1224

+0

@ Coder1224 CloudKitには変更タグのサポートが組み込まれていますが、いくつかのことに役立ちますが、すべてのアプリケーションが別の方法でデータを処理できるので、データが同期していないなどの処理が必要になります。 2014年、2015年、2016年のCloudKit WWDCセッションのいくつかを見ることは、この分野で有益な可能性が高いでしょう。私はいくつかのリンクで私のポストを更新します。 –

+0

リンクをありがとう、私は実際にそれらのすべてを見た。彼らはすべてそれらの中で有用なものを持っており、私は第1が必須であることに同意します。彼らはすべて私がコアデータを使用しているものをローカルにキャッシュすることについて言及しています。私はすべてのデータをローカルに保管しても問題ないと思いますか?私は、WWDCの話し合いのいずれにも言及していませんでした。私は "タグの変更"と "CKFetchRecordChangesOperation"をたくさん使うと思います。 – Coder1224

関連する問題