3
changesOperation.fetchRecordChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSData *clientChangeTokenData, NSError *operationError){
//encode and save token
NSData *encodedServerChangeToken = [NSKeyedArchiver archivedDataWithRootObject:serverChangeToken];
[[NSUserDefaults standardUserDefaults] setObject:encodedServerChangeToken forKey:fetchToken];
[[NSUserDefaults standardUserDefaults] synchronize];
//handle more - **this causes a retain cycle**
if(changesOperation.moreComing){
}
};
嗨只是在fetchRecordChangesCompletionBlock琢磨,文檔說:CKFetchRecordChangesOperation - moreComing
如果服務器無法提供所有更改的結果與此操作的對象,之前將此屬性設置爲YES在fetchRecordChangesCompletionBlock屬性中執行該塊。要獲取剩餘的更改,請使用服務器返回的更改標記創建一個新的CKFetchRecordChangesOperation對象。
在上面這個代碼導致保留週期,因此如何來處理和重新創建的運行時是有可能使用alreay創建的相同完成塊?
是啊,這就是我一直在想,似乎有點怪異的標準API的,所以創建一個新的讀取操作我怎麼重用塊已經在地點? – Andrew 2014-09-02 16:07:14
只需將所有操作代碼放入函數中,然後再次調用該函數。你必須在某處(在NSUserDefaults中)保存這個changtoken,以便你可以使用它作爲previousServerChangeToken。我在github上有這樣的示例代碼,但它是用Swift編寫的。見https://github.com/evermeer/EVCloudKitDao保存changetoken是棘手的。您必須使用NSKeyedArchiver進行歸檔和取消歸檔。 – 2014-09-03 06:31:20
感謝您的幫助,EVCloudKitDao看起來不錯 – Andrew 2014-09-03 11:15:30