2

アプリで CloudKit を使用していますが、うまく機能しているようです。ただし、新しいデバイスでアプリを初期化するときは、

CKFetchRecordChangesOperation *fetchRecordChangesOperation = [[CKFetchRecordChangesOperation alloc] initWithRecordZoneID:zoneID previousServerChangeToken:NIL];

以前のすべての削除と変更が同期されているように見えるため、多くの変更を取得します。

より良い方法はありますか?たとえば、現在のデータの完全なセットをダウンロードして、serverChangeToken を現在の値に設定するだけです。

4

1 に答える 1

1

CKServerChangeToken のドキュメントを見ると、CKFetchRecordChangesOperation を使用する場合にのみ取得できるようです。参照: https://developer.apple.com/library/prerelease/ios/documentation/CloudKit/Reference/CKServerChangeToken_class/index.html

では、どうすればそのトークンを手に入れることができるでしょうか。

通常は次のようにします: でわかるように、 でCKFetchRecordChangesOperation初期化できますpreviousServerChangeToken。このトークンはタイムスタンプのように機能します。操作が完了すると、このトークンが に返されますfetchRecordChangesCompletionBlock。たとえば、そのトークンをユーザーのデフォルトに保存する必要があります。次に を起動したときにCKFetchRecordChangesOperation、そのトークンを使用して、最後に呼び出してからの変更の読み取りを開始できます。

実際にトークンを保存するのは少し難しいかもしれません。次のようなプロパティを追加することをお勧めします。

private var previousChangeToken: CKServerChangeToken? {
    get {

        let encodedObjectData = NSUserDefaults.standardUserDefaults().objectForKey("\(container.containerIdentifier)_lastFetchNotificationId") as? NSData
        var decodedData: CKServerChangeToken? = nil
        if encodedObjectData != nil {
            decodedData = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObjectData!) as? CKServerChangeToken
        }
        return decodedData
    }
    set(newToken) {
        if newToken != nil {
            NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(newToken!), forKey:"\(container.containerIdentifier)_lastFetchNotificationId")
        }
    }
}

あなたの場合、他の実行中のアプリによってのみ作成された可能性のある変更トークンで新しいアプリケーションを開始する必要があります。そのため、変更トークンを NSUserDefaults に保存するだけでなく、パブリック データベースの CloudKit の特定の設定 recordType レコードにも保存する必要があります。NSUserDefaults にトークンを持たない新しくインストールされたアプリは、CloudKit 設定レコードからトークンを読み取ることができます。

于 2016-02-19T07:25:50.647 に答える