Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用previousServerchangetoken初始化CKFetchRecordZoneChangesOperation?_Ios_Iphone_Xcode_Objective C Blocks_Cloudkit - Fatal编程技术网

Ios 如何使用previousServerchangetoken初始化CKFetchRecordZoneChangesOperation?

Ios 如何使用previousServerchangetoken初始化CKFetchRecordZoneChangesOperation?,ios,iphone,xcode,objective-c-blocks,cloudkit,Ios,Iphone,Xcode,Objective C Blocks,Cloudkit,我正在从CloudKit服务器获取记录更改,但每次都出现错误 [LogFacilityCK]获取操作E0367CA861DAF5A9的连接错误: 错误域=NSCOCAERRORDOMAIN Code=4097“连接到名为的服务” com.apple.cloudd“UserInfo={NSDebugDescription=与服务的连接 命名为com.apple.cloudd} 我知道原因,因为我错误地初始化了CKFetchRecordZoneChangesOperation 请检查以下代码并更正我

我正在从CloudKit服务器获取记录更改,但每次都出现错误

[LogFacilityCK]获取操作E0367CA861DAF5A9的连接错误: 错误域=NSCOCAERRORDOMAIN Code=4097“连接到名为的服务” com.apple.cloudd“UserInfo={NSDebugDescription=与服务的连接 命名为com.apple.cloudd}

我知道原因,因为我错误地初始化了CKFetchRecordZoneChangesOperation 请检查以下代码并更正我:

 CKFetchRecordZoneChangesOperation  *operation = [[CKFetchRecordZoneChangesOperation alloc]initWithRecordZoneIDs:@[ recordZoneID ] optionsByRecordZoneID:@{@"Zone":recordZoneID,@"FetchRecordZoneChangesOptions":option}];
我需要这方面的帮助:

**@{@"Zone":recordZoneID,@"FetchRecordZoneChangesOptions":option}];**

只需创建变量:

var serverChangeToken: CKServerChangeToken? {

    guard let encoded = UserDefaults(suiteName: SharedGroupName)?.data(forKey: ServerChangeTokenKey) else {
        return nil
    }

    return NSKeyedUnarchiver.unarchiveObject(with: encoded) as? CKServerChangeToken
}
然后初始化一个对象:

        let zone = CKRecordZone(zoneName: "my_custom_zone_name")
        let options = CKFetchRecordZoneChangesOptions()
        options.previousServerChangeToken = serverChangeToken

        let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [zone.zoneID], optionsByRecordZoneID: [zone.zoneID: options])

即使使用正确的CKServerChangeToken,我也会遇到这个错误,因为我没有控制数组
changedZoneIDs
有0个元素的情况

严格地说,您需要两个单独的CKServerChangeToken来访问数据库更改和区域更改(比如
databaseChangeToken
zoneChangeToken
)。您可以按照Bartłomiej Semanńczyk的解释创建它们

-使用recordZoneWithIDChangedBlock获取已更改区域的zoneID
-使用fetchDatabaseChangesCompletionBlock保存databaseChangeToken并调用使用zoneChangeToken的CKFetchRecordZoneChangesOperation,
-每个区域都有自己的changeToken,因此我最终采用了以下解决方案:

let operation = CKFetchDatabaseChangesOperation(previousServerChangeToken: databaseChangeToken)
var changedZoneIDs: [CKRecordZoneID] = []

operation.recordZoneWithIDChangedBlock = { (zoneID) in
    changedZoneIDs.append(zoneID)
}

operation.fetchDatabaseChangesCompletionBlock = { (databaseToken, moreComing, error) in
{
    //manage moreComing
    //save databaseToken
    //manage error

    if changedZoneIDs.count > 0
    {
        var optionsByRecordZoneID = [CKRecordZoneID: CKFetchRecordZoneChangesOptions]()
        for zoneID in changedZoneIDs {
            let changeTokenData = UserDefaults.standard.value(forKey: "\(zoneID.zoneName) zoneChangeToken") as? Data // Read change token from disk
            var zoneChangeToken:CKServerChangeToken?

            if (changeTokenData != nil){
                zoneChangeToken = NSKeyedUnarchiver.unarchiveObject(with: changeTokenData!)as! CKServerChangeToken?
            }
            let options = CKFetchRecordZoneChangesOptions()
            options.previousServerChangeToken = zoneChangeToken
            optionsByRecordZoneID[zoneID] = options
        }
        let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: changedZoneIDs, optionsByRecordZoneID: optionsByRecordZoneID)

    // ...
    }

尤里卡!我忽略了zoneToken和databaseToken是不同的标记的概念。