Work in progress on responsibility cleanup

This commit is contained in:
Blake Watters
2012-01-06 09:39:20 -05:00
parent 254553dc7c
commit fb41eb73ec
9 changed files with 159 additions and 66 deletions

View File

@@ -3,7 +3,7 @@
// RestKit
//
// Created by Blake Watters on 8/8/09.
// Copyright 2009 Two Toasters
// Copyright 2009 RestKit
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -24,7 +24,6 @@
@class RKObjectMappingProvider;
@class RKObjectLoader;
@class RKObjectManager;
@protocol RKObjectLoaderDelegate <RKRequestDelegate>
@@ -130,16 +129,14 @@
* @default nil
* @see RKObjectMappingProvider
*/
// TODO: Rename to responseMapping
@property (nonatomic, retain) RKObjectMapping* objectMapping;
/**
* The object manager that initialized this loader. The object manager is responsible
* for supplying the mapper and object store used after HTTP transport is completed
A mapping provider containing object mapping configurations for mapping remote
object representations into local domain objects.
@see RKObjectMappingProvider
*/
//@property (nonatomic, readonly) RKObjectManager* objectManager;
// TODO: Comment...
@property (nonatomic, retain) RKObjectMappingProvider *mappingProvider;
/**
@@ -192,18 +189,20 @@
///////////////////////////////////////////////////////////////////////////////////////////
/**
* Initialize and return an object loader for a resource path against an object manager. The resource path
* specifies the remote location to load data from, while the object manager is responsible for supplying
* mapping and persistence details.
Initialize and return an autoreleased object loader targeting a remote URL using a mapping provider
@param URL A RestKit RKURL targetting a particular baseURL and resourcePath
@param mappingProvider A mapping provider containing object mapping configurations for processing loaded payloads
*/
+ (id)loaderWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate DEPRECATED_ATTRIBUTE;
- (id)initWithURL:(NSURL *)URL mappingProvider:(RKObjectMappingProvider *)mappingProvider;
+ (id)loaderWithURL:(NSURL *)URL mappingProvider:(RKObjectMappingProvider *)mappingProvider;
/**
* Initialize a new object loader with an object manager, a request, and a delegate
Initialize and return an autoreleased object loader targeting a remote URL using a mapping provider
@param URL A RestKit RKURL targetting a particular baseURL and resourcePath
@param mappingProvider A mapping provider containing object mapping configurations for processing loaded payloads
*/
- (id)initWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate DEPRECATED_ATTRIBUTE;
- (id)initWithURL:(NSURL *)URL mappingProvider:(RKObjectMappingProvider *)mappingProvider;
/**
* Handle an error in the response preventing it from being mapped, called from -isResponseMappable
@@ -211,3 +210,9 @@
- (void)handleResponseError;
@end
@class RKObjectManager;
@interface RKObjectLoader (Deprecations)
+ (id)loaderWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate DEPRECATED_ATTRIBUTE;
- (id)initWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate DEPRECATED_ATTRIBUTE;
@end

View File

@@ -47,17 +47,8 @@
@synthesize serializationMIMEType = _serializationMIMEType;
@synthesize sourceObject = _sourceObject;
+ (id)loaderWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate {
return [[[self alloc] initWithResourcePath:resourcePath objectManager:objectManager delegate:delegate] autorelease];
}
- (id)initWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate {
if ((self = [super initWithURL:[objectManager.client URLForResourcePath:resourcePath] delegate:delegate])) {
_mappingProvider = [objectManager.mappingProvider retain];
[objectManager.client setupRequest:self];
}
return self;
+ (id)loaderWithURL:(NSURL *)URL mappingProvider:(RKObjectMappingProvider *)mappingProvider {
return [[self alloc] initWithURL:URL mappingProvider:mappingProvider];
}
- (id)initWithURL:(NSURL *)URL mappingProvider:(RKObjectMappingProvider *)mappingProvider {
@@ -391,3 +382,20 @@
}
@end
@implementation RKObjectLoader (Deprecations)
+ (id)loaderWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate {
return [[[self alloc] initWithResourcePath:resourcePath objectManager:objectManager delegate:delegate] autorelease];
}
- (id)initWithResourcePath:(NSString*)resourcePath objectManager:(RKObjectManager*)objectManager delegate:(id<RKObjectLoaderDelegate>)delegate {
if ((self = [self initWithURL:[RKURL URLWithURL:[objectManager.client URLForResourcePath:resourcePath]] mappingProvider:objectManager.mappingProvider])) {
[objectManager.client setupRequest:self];
_delegate = delegate;
}
return self;
}
@end

View File

@@ -22,6 +22,7 @@
#import "RKObjectLoader.h"
#import "RKObjectRouter.h"
#import "RKObjectMappingProvider.h"
#import "RKObjectPaginator.h"
@protocol RKParser;
@@ -351,6 +352,13 @@ typedef enum {
*/
- (RKObjectLoader*)deleteObject:(id<NSObject>)object mapResponseWith:(RKObjectMapping*)objectMapping delegate:(id<RKObjectLoaderDelegate>)delegate;
// TODO: Document all of these...
- (Class)objectLoaderClass;
- (id)loaderWithResourcePath:(NSString *)resourcePath;
- (id)loaderWithURL:(NSURL *)URL;
- (RKObjectPaginator *)paginatorWithResourcePathPattern:(NSString *)resourcePathPattern;
- (id)loaderForObject:(id<NSObject>)object method:(RKRequestMethod)method;
/**
These methods are provided for situations where the remote system you are working with has slightly different conventions
than the default methods provide. They return fully initialized object loaders that are ready for dispatch, but
@@ -364,7 +372,7 @@ typedef enum {
the best place to begin work if you need to create a slightly different collection loader than what is
provided by the loadObjects family of methods.
*/
- (RKObjectLoader*)objectLoaderWithResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate;
- (RKObjectLoader*)objectLoaderWithResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate DEPRECATED_ATTRIBUTE;
/**
Returns an object loader configured for transmitting an object instance across the wire. A request will be constructed
@@ -375,6 +383,6 @@ typedef enum {
// TODO: Cleanup this comment
*/
- (RKObjectLoader*)objectLoaderForObject:(id<NSObject>)object method:(RKRequestMethod)method delegate:(id<RKObjectLoaderDelegate>)delegate;
- (RKObjectLoader*)objectLoaderForObject:(id<NSObject>)object method:(RKRequestMethod)method delegate:(id<RKObjectLoaderDelegate>)delegate DEPRECATED_ATTRIBUTE;
@end

View File

@@ -137,6 +137,59 @@ static RKObjectManager* sharedManager = nil;
/////////////////////////////////////////////////////////////
#pragma mark - Object Collection Loaders
- (Class)objectLoaderClass {
Class managedObjectLoaderClass = NSClassFromString(@"RKManagedObjectLoader");
if (self.objectStore && managedObjectLoaderClass) {
return managedObjectLoaderClass;
}
return [RKObjectLoader class];
}
- (id)loaderWithResourcePath:(NSString *)resourcePath {
RKURL *URL = [RKURL URLWithBaseURLString:self.client.baseURL resourcePath:resourcePath];
return [self loaderWithURL:URL];
}
- (id)loaderWithURL:(NSURL *)URL {
RKObjectLoader *loader = [[self objectLoaderClass] loaderWithURL:URL mappingProvider:self.mappingProvider];
if ([loader isKindOfClass:[RKManagedObjectLoader class]]) {
[(RKManagedObjectLoader *)loader setObjectStore:self.objectStore];
}
[self.client setupRequest:loader];
return loader;
}
- (NSURL *)baseURL {
// TODO: Turn RKClient baseURL into an NSURL and proxy...
return [NSURL URLWithString:self.client.baseURL];
}
- (RKObjectPaginator *)paginatorWithResourcePathPattern:(NSString *)resourcePathPattern {
return [RKObjectPaginator paginatorWithBaseURL:[self baseURL]
resourcePathPattern:resourcePathPattern
mappingProvider:self.mappingProvider];
}
- (id)loaderForObject:(id<NSObject>)object method:(RKRequestMethod)method {
NSString* resourcePath = [self.router resourcePathForObject:object method:method];
RKObjectLoader* loader = [self loaderWithResourcePath:resourcePath];
loader.method = method;
loader.sourceObject = object;
loader.targetObject = object;
loader.serializationMIMEType = self.serializationMIMEType;
loader.serializationMapping = [self.mappingProvider serializationMappingForClass:[object class]];
if (self.inferMappingsFromObjectTypes) {
RKObjectMapping* objectMapping = [self.mappingProvider objectMappingForClass:[object class]];
RKLogDebug(@"Auto-selected object mapping %@ for object of type %@", objectMapping, NSStringFromClass([object class]));
loader.objectMapping = objectMapping;
}
return loader;
}
- (RKObjectLoader*)objectLoaderWithResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* objectLoader = nil;
Class managedObjectLoaderClass = NSClassFromString(@"RKManagedObjectLoader");
@@ -151,7 +204,8 @@ static RKObjectManager* sharedManager = nil;
}
- (RKObjectLoader*)loadObjectsAtResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderWithResourcePath:resourcePath delegate:delegate];
RKObjectLoader* loader = [self loaderWithResourcePath:resourcePath];
loader.delegate = delegate;
loader.method = RKRequestMethodGET;
[loader send];
@@ -160,7 +214,8 @@ static RKObjectManager* sharedManager = nil;
}
- (RKObjectLoader*)loadObjectsAtResourcePath:(NSString*)resourcePath objectMapping:(RKObjectMapping*)objectMapping delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderWithResourcePath:resourcePath delegate:delegate];
RKObjectLoader* loader = [self loaderWithResourcePath:resourcePath];
loader.delegate = delegate;
loader.method = RKRequestMethodGET;
loader.objectMapping = objectMapping;
@@ -173,43 +228,35 @@ static RKObjectManager* sharedManager = nil;
#pragma mark - Object Instance Loaders
- (RKObjectLoader*)objectLoaderForObject:(id<NSObject>)object method:(RKRequestMethod)method delegate:(id<RKObjectLoaderDelegate>)delegate {
NSString* resourcePath = [self.router resourcePathForObject:object method:method];
RKObjectLoader* loader = [self objectLoaderWithResourcePath:resourcePath delegate:delegate];
loader.method = method;
loader.sourceObject = object;
loader.targetObject = object;
loader.serializationMIMEType = self.serializationMIMEType;
loader.serializationMapping = [self.mappingProvider serializationMappingForClass:[object class]];
if (self.inferMappingsFromObjectTypes) {
RKObjectMapping* objectMapping = [self.mappingProvider objectMappingForClass:[object class]];
RKLogDebug(@"Auto-selected object mapping %@ for object of type %@", objectMapping, NSStringFromClass([object class]));
loader.objectMapping = objectMapping;
}
return loader;
RKObjectLoader *loader = [self loaderForObject:object method:method];
loader.delegate = delegate;
return loader;
}
- (RKObjectLoader*)getObject:(id<NSObject>)object delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodGET delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodGET];
loader.delegate = delegate;
[loader send];
return loader;
}
- (RKObjectLoader*)postObject:(id<NSObject>)object delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodPOST delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodPOST];
loader.delegate = delegate;
[loader send];
return loader;
}
- (RKObjectLoader*)putObject:(id<NSObject>)object delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodPUT delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodPUT];
loader.delegate = delegate;
[loader send];
return loader;
}
- (RKObjectLoader*)deleteObject:(id<NSObject>)object delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodDELETE delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodDELETE];
loader.delegate = delegate;
[loader send];
return loader;
}
@@ -219,7 +266,8 @@ static RKObjectManager* sharedManager = nil;
#pragma mark - Block Configured Object Loaders
- (RKObjectLoader*)loadObjectsAtResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate block:(void(^)(RKObjectLoader*))block {
RKObjectLoader* loader = [self objectLoaderWithResourcePath:resourcePath delegate:delegate];
RKObjectLoader* loader = [self loaderWithResourcePath:resourcePath];
loader.delegate = delegate;
loader.method = RKRequestMethodGET;
// Yield to the block for setup
@@ -231,7 +279,8 @@ static RKObjectManager* sharedManager = nil;
}
- (RKObjectLoader*)sendObject:(id<NSObject>)object delegate:(id<RKObjectLoaderDelegate>)delegate block:(void(^)(RKObjectLoader*))block {
RKObjectLoader* loader = [self objectLoaderWithResourcePath:nil delegate:delegate];
RKObjectLoader* loader = [self loaderWithResourcePath:nil];
loader.delegate = delegate;
loader.sourceObject = object;
loader.targetObject = object;
loader.serializationMIMEType = self.serializationMIMEType;
@@ -284,7 +333,8 @@ static RKObjectManager* sharedManager = nil;
#pragma mark - Object Instance Loaders for Non-nested JSON
- (RKObjectLoader*)getObject:(id<NSObject>)object mapResponseWith:(RKObjectMapping*)objectMapping delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodGET delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodGET];
loader.delegate = delegate;
if ([object isMemberOfClass:[objectMapping objectClass]]) {
loader.targetObject = object;
} else {
@@ -296,7 +346,8 @@ static RKObjectManager* sharedManager = nil;
}
- (RKObjectLoader*)postObject:(id<NSObject>)object mapResponseWith:(RKObjectMapping*)objectMapping delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodPOST delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodPOST];
loader.delegate = delegate;
if ([object isMemberOfClass:[objectMapping objectClass]]) {
loader.targetObject = object;
} else {
@@ -308,7 +359,8 @@ static RKObjectManager* sharedManager = nil;
}
- (RKObjectLoader*)putObject:(id<NSObject>)object mapResponseWith:(RKObjectMapping*)objectMapping delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodPUT delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodPUT];
loader.delegate = delegate;
if ([object isMemberOfClass:[objectMapping objectClass]]) {
loader.targetObject = object;
} else {
@@ -320,7 +372,8 @@ static RKObjectManager* sharedManager = nil;
}
- (RKObjectLoader*)deleteObject:(id<NSObject>)object mapResponseWith:(RKObjectMapping*)objectMapping delegate:(id<RKObjectLoaderDelegate>)delegate {
RKObjectLoader* loader = [self objectLoaderForObject:object method:RKRequestMethodDELETE delegate:delegate];
RKObjectLoader* loader = [self loaderForObject:object method:RKRequestMethodDELETE];
loader.delegate = delegate;
if ([object isMemberOfClass:[objectMapping objectClass]]) {
loader.targetObject = object;
} else {