Subscriptionの受けには、前回の記事で書いた、Tokenを使った差分の取得をすれば良い。(※1)CKQueryNotificationは、対象のRecordIDが取得できるが、通知が必ず届くとは保証されないので、そのRecordを最新にすれば全て最新の状態になるとは言えない。前述したように、通知の差分を取得するためのCKFetchNotificationChangesOperationがdeprecatedになったので、差分の取得をせずCKQueryOperationで検索かけて最新になるようするのが良さそうだ。終わりにSubscriptionはCloudKitを理解するための大きな山場だと思う。いうイメージしか持っていなかったので混乱した。こんなに機能が違うのかと。この記事の内容をざっくり理解してから、ドキュメントやサンプルコードをみると理解し易いのではないかと思う。Zoneも一緒に反映する例としてもう少し詳しく書いたもの。長いので文中からは削除したがせっかくなのでペタリ。続き、今回はCloudKitのOperationについて。Databaseが取得可能。entitlementsにある。アプリ間で同じコンテナを参照したい場合は、カスタムコンテナの作成を行う。アプリケーション間でコンテナを共有するDatabaseへデータ登録や取得RecordやZoneなどをDatabaseに登録・取得する方法は2種類ある。Databaseのメソッドを使う。サブクラスが各操作ごとに用意されている。メソッドで追加ができますが、databaseプロパティにDatabaseを設定していれば自分で作成したOperationQueueでもOK。あるので、その処理が完了した時にcallbackすることも可能。使い方は基本同じなので、該当するCKOperationのクラスを探して実装していけばOKと思う。いうのは理解し易いと思う。使えば、まとめてRollbackもしてくれる(はず)。それ以外にもメリットがある。OperationsWWDCのセッションでも推奨しているような口ぶりでしたし、特に理由がない限りはCKOperationを使う方向でよさそうに思う。いうことで、今私は、単発処理も含め全てのDBアクセスをCKOperationで記述している。ちなみに、DatabaseやZoneの変更系と、アプリで利用しているRecordの更新系の2つのQueueを用意して実装している。設定により、タイムアウトの時間が変わる。オフラインの時は、オンラインになるまで待ってから処理してくれる。Unavailableのエラーが返ってくる。Operationsアプリが終了した後も引き続き処理を行ってくれる仕組み。IDが0件になってしまう。LongLivedのOperationIDを保存しておいて、明示的に指定して取得するとOperationを取得できる。iOSfetchLongLivedOperationで取得したOperationには、callbackが設定されていないようなので改めて設定してから実行し直す必要がある。クライアントでRecordをキャッシュクライアントでRecordをキャッシュしたり、変更差分を更新したりするコードはアプリ側で全て用意する必要がある。CloudKitに便利な機能はない。iCloudの統合機能はiOS10でdeprecatedになったようだ。Deprecation試していないが、RealmとCloudKitの連携フレームワークなどもある様子。CloudKitだが私は、現時点でフレームワークを使うのは避けた方がいいのではと思っている。使って差分のみの取得が可能。以外)Fetch完了時に取得できるtokenをアプリでキャッシュしておき、次回Fetch時に指定する。Databaseの場合は、CKFetchDatabaseChangesOperationのインスタンス時に前回取得していたServerChangeTokenを渡す。Zoneの場合は、CKFetchRecordZoneChangesOptionsに設定する。Tokenの期限切れエラーの場合は、Tokenをクリアし全取得しなおしが必要。理解するため、実際に試してみた。私が知りたかったことを中心に何回かに分けて書いてみます。今回はDatabaseとRecordについて。個人同士で共有できるもの。DBの中身は見ることはできない。Appleのアプリで利用している例を見るのがわかりやすい。いや、逆に、これらのアプリで利用することを目的に設計されていると考えてもいいと思う。設計次第かもしれないが、ソーシャルゲームのようなものは向いていないと思う。ツール系アプリが合っているのかもしれない。DBをメイン機能として使うのは難しい。Storageに保存される。Publicだけなのか、Privateなども含むのか、いまいちはっきり分からない。いう認識でOKな気も。すると、Publicを使わなければ開発者側は完全無料ということか。RecordデータはCKRecordで保存する。最初にRecordを保存した際、そのレコードの情報が型としてiCloudに保存される。