// // RKObjectManager.h // RestKit // // Created by Jeremy Ellison on 8/14/09. // Copyright (c) 2009-2012 RestKit. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #import "RKNetwork.h" #import "RKRouter.h" #import "RKObjectPaginator.h" #import "RKMacros.h" @protocol RKParser; @class RKManagedObjectStore; /** The object manager is the primary interface for interacting with RESTful resources via HTTP. It is responsible for retrieving remote object representations via HTTP and transforming them into local domain objects via the RKObjectMapper. It is also capable of serializing local objects and sending them to a remote system for processing. The object manager strives to hide the developer from the details of configuring an RKRequest, processing an RKResponse, parsing any data returned by the remote system, and running the parsed data through the object mapper.

Shared Manager Instance

Multiple instances of RKObjectManager may be used in parallel, but the first instance initialized is automatically configured as the sharedManager instance. The shared instance can be changed at runtime if so desired. See sharedManager and setSharedManager for details.

Configuring the Object Manager

The object mapper must be configured before object can be loaded from or transmitted to your remote backend system. Configuration consists of specifying the desired MIME types to be used during loads and serialization, registering object mappings to use for mapping and serialization, registering routes, and optionally configuring an instance of the managed object store (for Core Data).

MIME Types

MIME Types are used for two purposes within RestKit: 1. Content Negotiation. RestKit leverages the HTTP Accept header to specify the desired representation of content when contacting a remote web service. You can specify the MIME Type to use via the acceptMIMEType method. The default MIME Type is RKMIMETypeJSON (application/json). If the remote web service responds with content in a different MIME Type than specified, RestKit will attempt to parse it by consulting the [parser registry][RKParserRegistry parserForMIMEType:]. Failure to find a parser for the returned content will result in an unexpected response invocation of [RKObjectLoaderDelegate objectLoaderDidLoadUnexpectedResponse]. 1. Serialization. RestKit can be used to transport local object representation back to the remote web server for processing by serializing them into an RKRequestSerializable representation. The desired serialization format is configured by setting the serializationMIMEType property. RestKit currently supports serialization to RKMIMETypeFormURLEncoded and RKMIMETypeJSON. The serialization rules themselves are expressed via an instance of RKObjectMapping.

The Mapping Provider

RestKit determines how to map and serialize objects by consulting the mappingProvider. The mapping provider is responsible for providing instances of RKObjectMapper with object mappings that should be used for transforming mappable data into object representations. When you ask the object manager to load or send objects for you, the mappingProvider instance will be used for the object mapping operations constructed for you. In this way, the mappingProvider is the central registry for the knowledge about how objects in your application are mapped. Mappings are registered by constructing instances of RKObjectMapping and registering them with the provider: ` RKObjectManager *manager = [RKObjectManager managerWithBaseURL:myBaseURL]; RKObjectMapping *articleMapping = [RKObjectMapping mappingForClass:[Article class]]; [mapping mapAttributes:@"title", @"body", @"publishedAt", nil]; [manager.mappingProvider setObjectMapping:articleMapping forKeyPath:@"article"]; // Generate an inverse mapping for transforming Article -> NSMutableDictionary. [manager.mappingProvider setSerializationMapping:[articleMapping inverseMapping] forClass:[Article class]];`

Configuring Routes

Routing is the process of transforming objects and actions (as defined by HTTP verbs) into resource paths. RestKit ships

Initializing a Core Data Object Store

Loading Remote Objects

Routing & Object Serialization

Default Error Mapping

When an instance of RKObjectManager is configured, the RKObjectMappingProvider instance configured */ @interface RKObjectManager : NSObject /// @name Configuring the Shared Manager Instance /** Return the shared instance of the object manager */ + (RKObjectManager *)sharedManager; /** Set the shared instance of the object manager */ + (void)setSharedManager:(RKObjectManager *)manager; /** @name Object Mapping Dispatch Queue */ /** Returns the global default operation queue queue used for object mapping operations executed by RKObjectLoaders. All object loaders perform their loading within an operation queue. This provides control over the number of loaders that are performing expensive operations such as JSON parsing, object mapping, and accessing Core Data concurrently. The defaultMappingQueue is configured as the mappingQueue for all RKObjectManager's created by RestKit, but can be overridden on a per manager and per object loader basis. By default, the defaultMappingQueue is configured with a maximumConcurrentOperationCount of 1. */ + (NSOperationQueue *)defaultMappingQueue; /** Sets a new global default operation queue for use in object mapping operations executed by RKObjectLoaders. */ + (void)setDefaultMappingQueue:(NSOperationQueue *)defaultMappingQueue; /// @name Initializing an Object Manager /** Create and initialize a new object manager. If this is the first instance created it will be set as the shared instance */ + (id)managerWithBaseURLString:(NSString *)baseURLString; + (id)managerWithBaseURL:(NSURL *)baseURL; /** Initializes a newly created object manager with a specified baseURL. @param baseURL A baseURL to initialize the underlying client instance with @return The newly initialized RKObjectManager object */ - (id)initWithBaseURL:(RKURL *)baseURL; /// @name Network Integration /** The base URL of the underlying RKClient instance. Object loader and paginator instances built through the object manager are relative to this URL. @see RKClient @return The baseURL of the client. */ @property (weak, nonatomic, readonly) RKURL *baseURL; /// @name Configuring Object Mapping /** Router object responsible for generating URLs for HTTP requests */ @property (nonatomic, strong) RKRouter *router; /** A Core Data backed object store for persisting objects that have been fetched from the Web */ @property (nonatomic, strong) RKManagedObjectStore *managedObjectStore; /** The operation queue to use when performing expensive object mapping operations within RKObjectLoader instances created through this object manager */ @property (nonatomic, strong) NSOperationQueue *mappingQueue; /** The Default MIME Type to be used in object serialization. */ @property (nonatomic, strong) NSString *serializationMIMEType; /** The value for the HTTP Accept header to specify the preferred format for retrieved data */ @property (nonatomic, weak) NSString *acceptMIMEType; //////////////////////////////////////////////////////// /// @name Building Object Request Operations /** Creates and returns an RKObjectPaginator instance targeting the specified resource path pattern. The paginator instantiated will be initialized with an RKURL built by appending the resourcePathPattern to the baseURL of the client. @return The newly created paginator instance. @see RKObjectMappingProvider @see RKObjectPaginator */ //- (RKObjectPaginator *)paginatorWithResourcePathPattern:(NSString *)resourcePathPattern; //////////////////////////////////////////////////////// /// @name Registered Object Loaders @end