2011-08-25 8 views
8

Estoy utilizando RestKit para un proyecto y noté que ya no hay un método en la clase que pueda controlar todas las asignaciones en (elementToPropertyMappings), por lo tanto me preguntaba dónde El mejor lugar para poner el nuevo código era, actualmente lo estoy haciendo en mi controlador de vista, pero usaré la mayoría de las mismas asignaciones en otras áreas de mi código, así que hay un lugar más eficiente para ponerlo:¿Cuál es el mejor lugar para colocar asignaciones de objetos en RestKit

el código que me refiero es:

RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[User class]]; 
[userMapping mapKeyPath:@"id" toAttribute:@"identifier"]; 
[userMapping mapKeyPath:@"forename" toAttribute:@"forename"]; 
[userMapping mapKeyPath:@"surname" toAttribute:@"surname"]; 
[userMapping mapKeyPath:@"email" toAttribute:@"email"]; 
[userMapping mapKeyPath:@"twitter_username" toAttribute:@"twitterUsername"]; 
[userMapping mapKeyPath:@"created" toAttribute:@"created"]; 
[userMapping mapKeyPath:@"use_gravatar" toAttribute:@"useGravatar"]; 
[userMapping mapKeyPath:@"avatar_url" toAttribute:@"avatarURL"]; 
[userMapping mapKeyPath:@"gender" toAttribute:@"gender"]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:userMapping forKeyPath:@"user"]; 

sería muy bueno si esto podría ser en un método de la clase de usuario que pueda entonces marcar para organizar éstos mapa pings etc.

Muchas gracias

Respuesta

9

Hay algunas buenas maneras de organizar sus asignaciones actualmente recomendados:

  1. poner todos sus asignaciones en delegado de la aplicación y configurarlos en la inicialización aplicación. Esto los mantiene fuera de los controladores y es útil si tiene un pequeño número de asignaciones.
  2. Subclase RKObjectMappingProvider y compilar todas sus asignaciones en el método init de su subclase, luego instanciar y asignar su instancia de proveedor de correlaciones al administrador de objetos.
  3. Agregue una categoría a RKObjectMappingProvider con un método como 'defineMappings'. A continuación, importe el encabezado al delegado de su aplicación e inícielo a través de [mappingProvider defineMappings] después de inicializar RestKit.

El problema con la definición de asignaciones en un método de clase es que cuando tiene relaciones, puede terminar con dependencias circulares ya que no hay ivars disponibles para almacenar las instancias. Es posible que podamos hacer algo con bloques para ayudar a aliviar este problema, pero aún no se ha hecho tal trabajo.

+1

En el pasado acabo de crear un objeto RestKitManager y un objeto MappingsManager para quitar la configuración de mi delegado de la aplicación. El administrador de asignaciones mantiene una referencia a cada una de las asignaciones que he definido y proporciona un único punto de entrada al RestKitManager para iniciar y configurar las asignaciones, de modo que ni RestKitManager ni AppDelegate necesitan conocer ningún detalle sobre la cantidad de entidades involucradas. * SIN EMBARGO * la subclasificación del proveedor de mapas parece un enfoque más elegante. No había considerado eso antes. –

+0

no queriendo secuestrar esta pregunta, hice una pregunta muy relacionada aquí: http://stackoverflow.com/questions/7399095/where-to-put-object-mappings-in-restkit – Glenn

1

Por lo general, creo un método privado en mi delegado de la aplicación al que llamo durante la configuración de la aplicación que configura el RKObjectManager y luego construye todas las asignaciones que uso en toda la aplicación. Creo que los proyectos de ejemplo de RestKit usan este mismo patrón, así que definitivamente los verifique como referencia.

3

Creo que el modelo de dominio debe ser el único que debe saber sobre el mapeo. Aquí es cómo Mapa algunos flickr JSON:

me llaman las asignaciones cuando los necesite (puede estar en AppDelegate o donde quieras)

// Setup our object mappings 
RKObjectMapping *photoMapping = [Photo mapWithMapping:nil]; 
RKObjectMapping *photosMapping = [Photos mapWithMapping:photoMapping]; 

y este es uno de mis objetos de dominio: Contiene el método classMethod haciendo el mapeo.

#import "Photos.h" 
@implementation Photos 

+ (RKObjectMapping*)mapWithMapping: (RKObjectMapping*)aMapping 
{ 
    RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
    RKManagedObjectMapping *mapping = [RKManagedObjectMapping mappingForClass:[self class] inManagedObjectStore:objectManager.objectStore]; 

    [mapping mapKeyPathsToAttributes: 
     @"page", @"page", 
     @"pages", @"pages", 
     @"perpage", @"perpage", 
     @"stat", @"stat", 
     @"total", @"total", 
    nil]; 

    if (aMapping) { 
     [mapping mapRelationship:@"photo" withMapping:aMapping]; 
    } 

    return mapping; 
} 

@end 
Cuestiones relacionadas