CKFetchRecordChangesOperation 有很多变化是正常的吗?

Posted

技术标签:

【中文标题】CKFetchRecordChangesOperation 有很多变化是正常的吗?【英文标题】:Is is normal to end up with a LOT of changes on CKFetchRecordChangesOperation? 【发布时间】:2016-02-15 12:27:19 【问题描述】:

我在我的应用程序中使用 CloudKit,它似乎运行良好。但是,当我在新设备上初始化应用程序时,使用

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

我得到了很多更改,因为之前的所有删除和更改似乎都是同步的。

有没有更好的方法?例如只需下载完整的当前数据集并将 serverChangeToken 设置为当前值。

【问题讨论】:

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

【讨论】:

以上是关于CKFetchRecordChangesOperation 有很多变化是正常的吗?的主要内容,如果未能解决你的问题,请参考以下文章