为什么RKObjectManager没有使用我注册的RKObjectRequestOperation类?

时间:2014-08-07 03:06:47

标签: ios restkit

我试图拦截[RKObjectManager sharedManager]发出的所有HTTP请求,响应状态为401,以再次显示登录视图。为此,我创建了自己的自定义RKObjectRequestOperation类并覆盖了此方法:

- (void)setCompletionBlockWithSuccess:(void (^)(RKObjectRequestOperation *, RKMappingResult *))success
                              failure:(void (^)(RKObjectRequestOperation *, NSError *))failure
{
    DDLogVerbose(@"SUCCESS BLOCK"); // THIS DOES NOT PRINT WHEN I MAKE ANY REQUEST

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

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

        DDLogError(@"ERROR BLOCK"); // THIS DOES NOT PRINT WHEN I MAKE ANY REQUEST

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

    }];
}

创建自定义类后,我使用以下代码行将[RKObjectManager sharedManager注册到其中:

[sharedManager registerRequestOperationClass:[CustomRKObjectRequestOperation class]];

现在,每当我提出请求时,RKObjectManager似乎都没有使用我的自定义RKObjectRequestOperation课程。此请求不会从自定义类中打印出控制台日志:

  [sharedManager postObject:nil
                       path:@"users/sign_in"
                 parameters:@{@"email": email, @"password": password}
                    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}
                    failure:^(RKObjectRequestOperation *operation, NSError *error) {}];

这些是我最有可能使用RKObjectManager发出请求的方法:

– getObject:path:parameters:success:failure:
– postObject:path:parameters:success:failure:
– putObject:path:parameters:success:failure:
– patchObject:path:parameters:success:failure:
– deleteObject:path:parameters:success:failure:

如何使用RKObjectManager发出请求,以便它使用我注册的自定义RKObjectRequestOperation课程?



编辑:这就是我最终做的......

我在RKObjectManager上创建了一个类别,附加在一个方法上,该方法可以构建操作本身,而不是依赖RKObjectManager的默认方法。

- (void)enqueueRequestWithRouteName:(NSString *)routeName 
                             object:(id)object 
                         parameters:(NSDictionary *)parameters 
                            success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success 
                            failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure
{
     // You can do some manipulation to your parameters up here before passing it into the request

     NSMutableURLRequest *request = [self requestWithPathForRouteNamed:routeName object:object parameters:parameters];
     request.timeoutInterval = 30.0;
     YourCustomRKRequestOperationClass *operation = [[YourCustomRKRequestOperationClass alloc] initWithRequest:request responseDescriptors:self.responseDescriptors];

     // more customization for core data stuff
     operation.deletesOrphanedObjects = YES;
     operation.savesToPersistentStore = YES;
     operation.manageObjectContext    = self.managedObjectStore.mainQueueManagedObjectContext;
     operation.managedObjectCache     = self.managedObjectStore.managedObjectCache;
     operation.fetchRequestBlocks     = self.fetchRequestBlocks;

     // This is where the magic happens
     [operation setCompletionBlockWithSuccess:success failure:failure];

     [self enqueueObjectRequestOperation:operation];
}

每当您想要对映射路径发出请求时,您可以使用此方法而不是其他方法。

0 个答案:

没有答案