CKFetchRecordChangesOperation-moreComing

And*_*rew 4 ios ios8 cloudkit

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){

    }

};
Run Code Online (Sandbox Code Playgroud)

嗨,您只是想知道在fetchRecordChangesCompletionBlock中,文档说:

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

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

Edw*_*eer 5

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

__weak CKFetchNotificationChangesOperation *weakChangesOperation = changesOperation;
changesOperation.fetchRecordChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSData *clientChangeTokenData, NSError *operationError){
    ...
    if(weakChangesOperation.moreComing){
    }
Run Code Online (Sandbox Code Playgroud)