2011-08-25 11 views
8

Używam RestKit dla projektu i zauważyłem, że nie ma już metody w klasie, którą można kontrolować wszystkie odwzorowania w (elementToPropertyMappings), dlatego zastanawiałem się, gdzie najlepsze miejsce do umieszczenia nowego kodu, obecnie robię to w moim kontrolerze widoku, ale będę używał większości tych samych mapowań w innych obszarach mojego kodu, więc jest tam bardziej wydajne miejsce na umieszczenie go:Gdzie jest najlepsze miejsce do umieszczania odwzorowań obiektów w pakiecie RestKit

Kod mam na myśli to:

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"]; 

byłoby wspaniale, gdyby mógł to być metoda na klasę użytkownika, który można następnie zadzwonić do konfiguracji tych map pingi itp

Dziękujemy

Odpowiedz

9

Istnieje kilka dobrych sposobów, aby uporządkować mapowania obecnie zalecane:

  1. Put wszystkich odwzorowań do delegata aplikacji i skonfigurować je w aplikacji inicjalizacji. Uchroni to ich przed kontrolerami i przydaje się, jeśli masz małą liczbę mapowań.
  2. Podklasuj obiekt RKObjectMappingProvider i zbuduj wszystkie swoje odwzorowania w metodzie init swojej podklasy, a następnie stwórz instancję odwzorowania i przypisz ją do menedżera obiektów.
  3. Dodaj kategorię do RKObjectMappingProvider za pomocą metody takiej jak "defineMappings". Następnie zaimportuj nagłówek do delegata aplikacji i wywołaj go za pomocą [mappingProvider defineMappings] po zainicjowaniu pakietu RestKit.

Problem z definiowaniem odwzorowań w metodzie klasowej polega na tym, że gdy masz relacje, możesz skończyć z zależnościami cyklicznymi, ponieważ nie ma dostępnych ivars do przechowywania instancji. Możemy być w stanie zrobić coś z blokami, aby pomóc w złagodzeniu tego problemu, ale nie wykonano jeszcze takich zadań.

+1

W przeszłości właśnie utworzyłem obiekt RestKitManager i MappingsManager, aby przenieść konfigurację z delegata mojej aplikacji. Menedżer mapowań zachowuje odwołanie do każdego z mapowań, które zdefiniowałem i zapewnia pojedynczy punkt wejścia do narzędzia RestKitManager w celu inicjowania i konfigurowania odwzorowań, tak aby ani RestKitManager, ani AppDelegate nie potrzebowały żadnych informacji na temat liczba zaangażowanych podmiotów. * JEDNAK * podklasowanie dostawcy map wydaje się bardziej eleganckim podejściem. Nie myślałem o tym wcześniej. –

+0

nie chcąc porwać się na to pytanie Zadałem bardzo ściśle powiązane pytanie tutaj: http://stackoverflow.com/questions/7399095/where-to-put-object-mappings-in-restkit – Glenn

1

Zwykle tworzę prywatną metodę w moim Delegacie aplikacji, którą wywołuję podczas konfiguracji aplikacji, która konfiguruje RKObjectManager, a następnie konstruuje wszystkie mapowania, których używam w aplikacji. Sądzę, że przykładowe projekty RestKit używają tego samego wzorca, więc zdecydowanie sprawdź je jako odniesienie.

3

Myślę, że model domeny powinien być jedynym, który powinien wiedzieć o mapowaniu. Oto jak mapować niektóre flickr json:

nazywam mapowania, gdy ich potrzebują (mogą być w AppDelegate lub gdziekolwiek chcesz)

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

I to jest jeden z moich obiektów domeny: Zawiera metodę classMethod wykonującą mapowanie.

#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 
Powiązane problemy