簡體   English   中英

如何用previousServerchangetoken初始化CKFetchRecordZoneChangesOperation?

[英]How to initialise CKFetchRecordZoneChangesOperation with previousServerchangetoken?

我從CloudKit Server獲取記錄更改,但每次出現錯誤

[LogFacilityCK]操作E0367CA861DAF5A9出現連接錯誤:錯誤域= NSCocoaErrorDomain代碼= 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來訪問數據庫更改和zoneChanges(比如說databaseChangeTokenzoneChangeToken )。 您可以像BartłomiejSemańczyk所說的那樣創建它們

-use recordZoneWithIDChangedBlock獲取更改區域的zoneID
-use fetchDatabaseChangesCompletionBlock保存databaseChangeToken並調用使用zoneChangeToken的CKFetchRecordZoneChangesOperation,
-each zone有自己的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)

    // ...
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM