Где лучшее место для размещения сопоставлений объектов в RestKit - PullRequest
8 голосов
/ 25 августа 2011

Я использую RestKit для проекта, и я заметил, что в классе больше нет метода, в котором вы можете управлять всеми отображениями (elementToPropertyMappings), поэтому мне было интересно, где в настоящее время находится лучшее место для размещения нового кодая делаю это в моем контроллере представления, но я буду использовать большинство таких же отображений в других областях моего кода, так что есть ли более эффективное место для его размещения:

Код, на который я ссылаюсьis:

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

Было бы замечательно, если бы это было в методе класса User, который я затем мог бы вызвать для настройки этих сопоставлений и т. д.

Большое спасибо

Ответы [ 3 ]

9 голосов
/ 25 августа 2011

Существует несколько хороших способов организации отображений, рекомендуемых в настоящее время:

  1. Поместите все сопоставления в делегат приложения и настройте их при инициализации приложения.Это исключает их из контроллеров и полезно, если у вас есть небольшое количество отображений.
  2. Создайте подкласс RKObjectMappingProvider и создайте все ваши сопоставления в методе init вашего подкласса, затем создайте экземпляр и назначьте свой экземпляр поставщика сопоставленийв диспетчер объектов.
  3. Добавьте категорию в RKObjectMappingProvider с помощью метода, например «defineMappings».Затем импортируйте заголовок в ваш делегат приложения и вызовите его через [mappingProvider defineMappings] после инициализации RestKit.

Проблема с определением отображений в методе класса заключается в том, что при наличии отношений вы можете свернутьс круговыми зависимостями, так как нет доступных иваров для хранения экземпляров.Возможно, мы сможем что-то сделать с блоками, чтобы облегчить эту проблему, но такая работа еще не выполнена.

3 голосов
/ 15 октября 2012

Я думаю, что модель предметной области должна быть единственной, кто должен знать о сопоставлении.Вот как я сопоставляю некоторые flickr json:

Я вызываю сопоставления, когда они вам нужны (можно в AppDelegate или где угодно)

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

И это одна из моих областейobjects: содержит classMethod, выполняющий сопоставление.

#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
1 голос
/ 25 августа 2011

Я обычно создаю приватный метод в моем делегате приложения, который я вызываю во время настройки приложения, который устанавливает RKObjectManager, а затем создает все сопоставления, которые я использую в приложении.Я считаю, что примеры проектов RestKit используют этот же шаблон, поэтому обязательно ознакомьтесь с ними в качестве ссылки.

...