我试图拦截[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];
}
每当您想要对映射路径发出请求时,您可以使用此方法而不是其他方法。