2016-02-02 27 views
6

我正在使用我的應用程序中的CloudKit同步(「微型數據,所有設備」模型,以及私有數據庫中的自定義區域)。CKModifyRecordsOperation中的clientChangeTokenData是什麼?

CKModifyRecordsOperation包含在該文檔中描述NSData類型的clientChangeTokenData屬性如下:

當從取操作修改記錄,指定客戶機生成的數據令牌使用此屬性,以指示哪個版本您上次修改的記錄。比較您在下次記錄抓取時提供給數據令牌的數據令牌,以確認服務器已成功接收設備的上次修改請求。

我不明白爲什麼我應該打擾,因爲每個請求,我得到一個完成塊告訴我服務器是否已經成功地收到我的請求。爲什麼我需要手動比較此客戶端令牌?

是否指定clientChangeTokenData正確處理我的用例?我跟蹤本地數據更改並在每次數據更改時推送隊列中的所有內容。遠程更改通過區域訂閱進行跟蹤。

如果需要,我如何正確生成此令牌,因爲我在我的CKModifyRecordsOperation(我的API使用目的是批量操作)中有各種記錄更改。這裏的一般工作流程是什麼?

謝謝。

回答

3

如果您想要寫入CloudKit的本地更改並且希望確保您的更改基於CloudKit中最新版本的數據,那麼您只有一個理由來檢查該令牌。

您也可以忽略令牌並保存數據。如果數據同時發生變化,您將收到CloudKit錯誤,然後您可以處理它。

+0

'clientChangeTokenData'似乎從CKModifyRecordsOperation完成塊中是零。我們(開發人員)必須在將操作添加到操作隊列之前生成並傳入操作嗎?目前尚不清楚。 –

+0

您應該檢查名爲recordChangeTag的密鑰它由CloudKit自動生成 –

+0

您可以自己爲修改操作設置clientChangeTokenData。然後在完成同步時驗證它是否匹配,即CKFetchRecordZoneChangesOperation。你爲什麼想這麼做......我還不確定。 – malhal

1

目前還不清楚,但我猜想clientChangeTokenData在發送巨大的修改記錄操作的情況下很有用,例如,刪除100條記錄,這需要很長時間。然後說你的應用程序發送一個查詢在其他動作的取得請求(或獲取的變化)的結果集,將通過或者修改的影響:

  1. 啓動,並同時運行現有修改的不是招操作尚未完成。
  2. 在服務器處理完先前修改的結果(文檔傾向於暗示處理延遲)之前啓動。

如果提取完成包含與修改一起發送的不同clientChangeTokenData,那麼您知道它還沒有收到(或完成處理?)更改。在這種情況下,您可能會發生錯誤,並提示服務器需要更多時間,或者在一段時間後自動重試抓取。

順便說一句,在我的測試中,這個令牌是每個設備。