2015-03-19 104 views
1

下面的簡化方法中的CKFetchRecordChangesOperation不返回任何記錄。 我用nil調用它,最初獲取所有記錄,但它只返回服務器令牌。 但是,如果我使用CKQuery,我會正確地獲取所有記錄。CKFetchRecordChangesOperation不返回任何記錄

我錯過了什麼?

func fetchChangedRecords(token :CKServerChangeToken?) { 

    println("\(__FUNCTION__) token: \(token)") 

    let zoneID = CKRecordZoneID(zoneName: kMyZone, ownerName: CKOwnerDefaultName) 
    var op = CKFetchRecordChangesOperation(recordZoneID: zoneID, previousServerChangeToken: token) 

    op.recordChangedBlock = { 
     record in 
     println("\(__FUNCTION__) record \(record)") 
    } 

    op.recordWithIDWasDeletedBlock = { 
     recordID in 
     println("\(__FUNCTION__) record \(recordID)") 

    } 

    op.fetchRecordChangesCompletionBlock = { 
     serverChangeToken, clientChangeToken, error in 

     println("\(__FUNCTION__) server token \(serverChangeToken), clientChangeToken \(clientChangeToken)") 

     if let err = error { 
      println("\(__FUNCTION__) Error: \(err)") 
     } 

     if op.moreComing { 
      println("\(__FUNCTION__) moreComing") 
      self.fetchChangedRecords(serverChangeToken) 
     } 
    } 

    println("\(__FUNCTION__) op \(op)") 

    privateDB.addOperation(op) 
} 

編輯:

所以,我更新的代碼基於moreComing值的額外的方法調用。下面是印刷的內容。我還檢查了該區域在那裏。

moreComing似乎沒有設置。

fetchChangedRecords token: nil 
fetchChangedRecords op <CKFetchRecordChangesOperation: 0x16dd3e30; operationID=14A302B7-2718-4E05-97C7-B28EC01ED75B> 
fetchChangedRecords server token <CKServerChangeToken: 0x16ddfd80; data=AQAAAAAAAAACf/////////+p9bdUdAhLUK36bhza7+4g>, clientChangeToken nil 

只是爲了表明該區域在那裏。

zone fetching succeeded [<CKRecordZone: 0x16dda330; zoneID=MyZone:__defaultOwner__, capabilities=(Atomic,Sync)>, <CKRecordZone: 0x16d5bb70; zoneID=_defaultZone:__defaultOwner__, capabilities=(none)>] 
+0

該代碼看起來對我來說是正確的。你能附上運行這個代碼的輸出嗎?如果完成塊中的moreComing == YES,則需要使用更新後的更改令牌繼續調用CKFetchRecordChangesOperation,直到「moreComing == NO」 – farktronix 2015-03-20 00:10:19

+0

這很奇怪。您是否介意通過啓用日誌記錄來重現這一點,並且可以提交雷達或在某處發佈日誌?確保運行不返回結果的CKFetchChangesOperation和返回結果的CKQueryOperation。有關啓用和獲取日誌的說明,請訪問https://developer.apple.com/bug-reporting/ios/icloud/#icloud-drive – farktronix 2015-03-21 19:54:19

+1

非常感謝幫助指針。事實證明(我很不好意思承認這一點),問題就在於我的所有記錄最初放入默認區域,然後我忘記了,並試圖從定製區域獲取更改的區域。 – yuzer 2015-03-21 21:05:40

回答

0

看起來像CKFetchRecordChangesOperation已棄用。我認爲它可能已被替換爲CKFetchDatabaseChangesOperationCKFetchRecordZoneChangesOperationCKFetchDatabaseChangesOperation2016 WWDC Best Practices中討論過,但它在共享數據庫的上下文中。

+0

它只適用於一個自定義區域。 – 2016-12-06 17:08:12