2016-09-23 35 views
3

我使用CloudKit在我的應用程序,並按照在WWDC視頻「CloudKit最佳實踐」的最佳實踐開始CKFetchDatabaseChangesOperation返回任何記錄區ID

要做的第一件事就是檢查更改我做像這樣,

let changesOperation = CKFetchDatabaseChangesOperation(previousServerChangeToken: databaseChangeToken) 
changesOperation.fetchAllChanges = true 
changesOperation.recordZoneWithIDChangedBlock = { self.recordZoneWithIDChanged($0) } 
changesOperation.recordZoneWithIDWasDeletedBlock = { self.recordZoneWithIDWasDeleted($0) } 
changesOperation.changeTokenUpdatedBlock = { self.changeTokenUpdate($0) } 
changesOperation.fetchDatabaseChangesCompletionBlock = { self.fetchDatabaseChangesCompletion($0, isMoreComing: $1, error: $2) } 

privateDatabase.add(changesOperation) 

有私人數據庫中的記錄,我設置了取指,但我只得到了changeTokenUpdatedBlockfetchDatabaseChangesCompletion

我說得對,當我運行此操作時,我應該會看到recordZoneWithIDChangedBlock被點擊,並且我的私有數據庫的默認區域被傳遞到此塊?

這意味着,當我把我的fetchDatabaseChangesCompletion,沒有什麼可以抓取,因爲記錄區ID的數組爲空:(注意,error爲零)

fileprivate func fetchDatabaseChangesCompletion(_ newToken: CKServerChangeToken?, isMoreComing: Bool, error: Error?) 
{ 
    if let error = error 
    { 
     // Handle error 

     return 
    } 

    let fetchZoneChangesOperation = CKFetchRecordZoneChangesOperation(recordZoneIDs: changedRecordZoneIDs, 
                     optionsByRecordZoneID: nil) 
    fetchZoneChangesOperation.recordChangedBlock = { self.recordChanged($0) } 
    fetchZoneChangesOperation.recordWithIDWasDeletedBlock = { self.recordWithIDWasDeleted($0, string: $1) } 
    fetchZoneChangesOperation.recordZoneFetchCompletionBlock = { self.recordZoneFetchCompletion($0, newChangeToken: $1, clientSentChangeTokenData: $2, isMoreComing: $3, error: $4) } 
    fetchZoneChangesOperation.completionBlock = { self.fetchRecordZoneChangesCompletion() } 

    privateDatabase.add(fetchZoneChangesOperation) 
} 
+0

請注意,我正在傳遞'nil'到'previousServerChangeToken'來獲取所有更改... –

回答

0

我碰到了同樣的問題,這是由於到CKFetchDatabaseChangesOperationCKFetchRecordZoneChangesOperation只適用於自定義區域。 CloudKit確實希望開發人員對數據進行劃分,以便在自定義區域中支持更多功能。

使用默認區域存儲記錄的缺點是它沒有任何特殊功能。您無法將一組記錄以原子方式保存在默認區域中。同樣,您不能在默認區域中的記錄上使用CKFetchRecordChangesOperation對象。

CKRecordZone default() Reference

CKFetchRecordChangesOperation在IOS 10被廢棄並用CKFetchRecordZoneChangesOperation替換。