Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当子类化RKObjectRequestOperation以检查错误时,如何重试失败的操作?_Ios_Objective C_Restkit_Restkit 0.20 - Fatal编程技术网

Ios 当子类化RKObjectRequestOperation以检查错误时,如何重试失败的操作?

Ios 当子类化RKObjectRequestOperation以检查错误时,如何重试失败的操作?,ios,objective-c,restkit,restkit-0.20,Ios,Objective C,Restkit,Restkit 0.20,我已将RKManagedObjectRequestOperation子类化并重写以下方法 - (void)setCompletionBlockWithSuccess:(void ( ^ ) ( RKObjectRequestOperation *operation , RKMappingResult *mappingResult ))success failure:(void ( ^ ) ( RKObjectRequestOperation *operation , NSError *e

我已将RKManagedObjectRequestOperation子类化并重写以下方法

    - (void)setCompletionBlockWithSuccess:(void ( ^ ) ( RKObjectRequestOperation *operation , RKMappingResult *mappingResult ))success failure:(void ( ^ ) ( RKObjectRequestOperation *operation , NSError *error ))failure
{

    [super setCompletionBlockWithSuccess:^void(RKObjectRequestOperation *operation , RKMappingResult *mappingResult) {
        if (success) {
            success(operation, mappingResult);
        }

    }failure:^void(RKObjectRequestOperation *operation , NSError *error) {

        NSInteger statusCode = operation.HTTPRequestOperation.response.statusCode;
        switch (statusCode) {
            case  401: // not authenticated
            {
                MyError* errorResponse = (MyError*)[[error.userInfo objectForKey:@"RKObjectMapperErrorObjectsKey"] firstObject];
                if(errorResponse && [errorResponse.oauth2ErrorCode isEqualToString:@"invalid_token"]){

                    RKObjectRequestOperation* repeatOp = [operation copy];
                    [repeatOp setCompletionBlockWithSuccess:success failure:failure];
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"InvalidTokenFailure" object:repeatOp];

                } else{

                    if (failure) {
                        failure(operation, error);
                    }

                }

            }
                break;

            default:
            {
                if (failure) {
                    failure(operation, error);
                }

            }
                break;
        }
    }];
}
然后,在失败通知的观察者中,我发出一个刷新oauth令牌的请求,如果成功,我想再次将原始请求排队,但是在从原始操作中替换querystring参数之后

在通知观察员的代码中:

-(void)restRequestFailedWithOperation:(NSNotification*)notification{

    RKManagedObjectRequestOperation *operation = (RKManagedObjectRequestOperation *)notification.object;
    if (operation) {

                // issue token refresh request and in its success block:
                ..... 

                 [[RKObjectManager sharedManager] enqueueObjectRequestOperation:operation];

         }      
}

我没有看到在RKManagedObjectRequestOperation中替换特定querystring参数的方法。而且,由于原始操作仍然具有旧令牌,因此再次将其排队将不起作用

一种解决方法是将oauth令牌附加到每个传出请求的问题转移到RKHTTPRequestOperation类的子类中,并重写该方法

-(NSURLRequest*)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response{

}
这将确保每个传出请求将获得最新的oauth令牌。它使您无需使用新请求修改失败的操作

确保按如下方式注册子类(MyHTTPRequestOperation):

[[RKObjectManager sharedManager] registerRequestOperationClass:[MyHTTPRequestOperation class]];
我不相信这是最好的办法。理想情况下,可以实现RKPaginator类设置的模式。RKPaginator允许在修改某些查询参数时轻松重复相同的请求