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. 您必须将该令牌保存在例如用户默认值中。然后下次启动 aCKFetchRecordChangesOperation时,您可以使用该令牌开始读取自上次调用它以来的更改。

实际上保存令牌可能有点棘手。我可以建议添加这样的属性:

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 中的一个特定设置记录类型记录中。新安装的应用程序在其 NSUserDefaults 中没有令牌,然后可以从您的 CloudKit 设置记录中读取令牌。

于 2016-02-19T07:25:50.647 回答