2014-09-02 81 views
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創建的相同完成塊?

回答

4

您應該定義一個弱changesoperation這樣

__weak CKFetchNotificationChangesOperation *weakChangesOperation = changesOperation; 
changesOperation.fetchRecordChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSData *clientChangeTokenData, NSError *operationError){ 
    ... 
    if(weakChangesOperation.moreComing){ 
    } 
+1

是啊,這就是我一直在想,似乎有點怪異的標準API的,所以創建一個新的讀取操作我怎麼重用塊已經在地點? – Andrew 2014-09-02 16:07:14

+0

只需將所有操作代碼放入函數中,然後再次調用該函數。你必須在某處(在NSUserDefaults中)保存這個changtoken,以便你可以使用它作爲previousServerChangeToken。我在github上有這樣的示例代碼,但它是用Swift編寫的。見https://github.com/evermeer/EVCloudKitDao保存changetoken是棘手的。您必須使用NSKeyedArchiver進行歸檔和取消歸檔。 – 2014-09-03 06:31:20

+0

感謝您的幫助,EVCloudKitDao看起來不錯 – Andrew 2014-09-03 11:15:30