4
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,文档说:

如果服务器无法使用此操作对象传递所有更改的结果,它会在执行 fetchRecordChangesCompletionBlock 属性中的块之前将此属性设置为 YES。要获取剩余的更改,请使用服务器返回的更改令牌创建一个新的 CKFetchRecordChangesOperation 对象。

在上面的代码中,这会导致一个保留周期,那么应该如何处理这个问题,在重新创建操作时是否可以使用已经创建的相同完成块?

4

1 回答 1

5

您应该像这样定义一个弱更改操作

__weak CKFetchNotificationChangesOperation *weakChangesOperation = changesOperation;
changesOperation.fetchRecordChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSData *clientChangeTokenData, NSError *operationError){
    ...
    if(weakChangesOperation.moreComing){
    }
于 2014-09-02T12:47:29.140 回答