2017-09-01 10 views
1

私はCKFetchRecordZoneChangesOptionsで削除レコードを取得できない理由はわかりませんが、作成して変更したレコードを取得できますが、deleteはレコードを削除できません。
昨日、変更履歴を正常に取得できます。スウィフトクラウドキットCKFetchRecordZoneChangesOptionsは削除レコードを返すことができません

は、ここに私のコード

public func handleNotification(whichNotification : Int) { 

    zoneID = UserDataCustomZone.zoneID 

    if #available(iOS 10.0, *) { 

     // Use the ChangeToken to fetch only whatever changes have occurred since the last 
     // time we asked, since intermediate push notifications might have been dropped. 
     var changeToken: CKServerChangeToken? = nil 
     let changeTokenData = UserDefaults.standard.data(forKey: serverChangeTokenKey) 

     if changeTokenData != nil { 
      changeToken = NSKeyedUnarchiver.unarchiveObject(with: changeTokenData!) as! CKServerChangeToken? 
     } 

     let options = CKFetchRecordZoneChangesOptions() 
     options.previousServerChangeToken = changeToken 
     let optionsMap = [zoneID!: options] 
     let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [zoneID!], optionsByRecordZoneID: optionsMap) 
     operation.fetchAllChanges = true 
     // only can receive created and modified change record 
     operation.recordChangedBlock = { record in 
      //show record 
      print("check this out \(record)") 

      } 

    } 

    operation.recordZoneChangeTokensUpdatedBlock = { zoneID, changeToken, data in 

     print("print Token \(String(describing: changeToken))") 

     guard let changeToken = changeToken else { 
      return 
     } 

     let changeTokenData = NSKeyedArchiver.archivedData(withRootObject: changeToken) 
     UserDefaults.standard.set(changeTokenData, forKey: self.serverChangeTokenKey) 
    } 

    operation.recordZoneFetchCompletionBlock = { zoneID, changeToken, data, more, error in 
     guard error == nil else { 
      return 
     } 
     guard let changeToken = changeToken else { 
      return 
     } 

     let changeTokenData = NSKeyedArchiver.archivedData(withRootObject: changeToken) 
     UserDefaults.standard.set(changeTokenData, forKey: self.serverChangeTokenKey) 
    } 

    operation.fetchRecordZoneChangesCompletionBlock = { error in 
     guard error == nil else { 
      return 
     } 
    } 

    operation.qualityOfService = .utility 

    let container = CKContainer.default() 
    let db = container.privateCloudDatabase 
    db.add(operation) 

    } else { 
     // Fallback on earlier versions 
    } 

} 
+0

Cloudkinのデータを削除すると、サブスクリプションのリモート通知が取得できます。 – RiceEater

答えて

0

私はあなたが、レコードの作品やアップデートを受信するために十分であるrecordZoneChangeTokensUpdatedBlockハンドラを定義している気づいています。しかし、CKFetchRecordZoneChangesOperationは、そのrecordWithIDWasDeletedBlockハンドラを介してレコードの削除を通知します。宣言は次のとおりです。

var recordWithIDWasDeletedBlock: ((CKRecordID, String) -> Void)? { get set }

だから、基本的に次のような余分な行を含める必要があります。

operation.recordWithIDWasDeletedBlock = { recordID, recordType in ... }

をあなたの元のコードで。

参照のためにApple developer documentationを参照してください。

全体のプロセスと参照コードはFetching ChangesMaintaining a Local Cache of CloudKit RecordsCloudKit Quick Startの章に記載されています。

関連する問題