iOS RestKit, какова цель метода [mappingProvider setMapping: forKeyPath:]?

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

[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"];
[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"];
[objectManager.mappingProvider setMapping:projectMapping forKeyPath:@"project"];

Файл JSON, который загружается как данные, содержит 3 объекта: проект, задачи и пользователь. Обратите внимание, что задачи во множественном числе.

В базовой модели данных определены 3 объекта: пользователь, задача и проект. Они начинаются с заглавных букв.

Наконец, классы NSManagedObject, производные от модели данных, имеют отношения: Task>assignedUser и User>tasks и Project, являющийся обычным NSObject.

Должна ли @"задача" быть @"задачей"?

@implementation RKRelationshipMappingExample

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:gRKCatalogBaseURL];
        objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RKRelationshipMappingExample.sqlite"];


        RKManagedObjectMapping* taskMapping = [RKManagedObjectMapping mappingForClass:[Task class]];
        [taskMapping mapKeyPath:@"id" toAttribute:@"taskID"];
        [taskMapping mapKeyPath:@"name" toAttribute:@"name"];
        [taskMapping mapKeyPath:@"assigned_user_id" toAttribute:@"assignedUserID"];
        taskMapping.primaryKeyAttribute = @"taskID"; //uniquely identifies the record for update purposes

        RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]];
        [userMapping mapAttributes:@"name", @"email", nil];
        [userMapping mapKeyPath:@"id" toAttribute:@"userID"];
        userMapping.primaryKeyAttribute = @"userID";


        [objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"];
        [objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"];

        [userMapping mapRelationship:@"tasks" withMapping:taskMapping];        
        [taskMapping mapRelationship:@"assignedUser" withMapping:userMapping];

        [taskMapping connectRelationship:@"assignedUser" withObjectForPrimaryKeyAttribute:@"assignedUserID"];


        // NOTE - Project is not backed by Core Data
        RKObjectMapping* projectMapping = [RKObjectMapping mappingForClass:[Project class]];
        [projectMapping mapKeyPath:@"id" toAttribute:@"projectID"];
        [projectMapping mapAttributes:@"name", @"description", nil];
        [projectMapping mapRelationship:@"user" withMapping:userMapping];
        [projectMapping mapRelationship:@"tasks" withMapping:taskMapping];
        [objectManager.mappingProvider setMapping:projectMapping forKeyPath:@"project"];



    }

    return self;
}

//more code
@end

Спасибо за пояснение!


person Alex Stone    schedule 07.03.2012    source источник


Ответы (1)


Метод RKObjectMappingProvider setMapping:forKeyPath: указывает провайдеру сопоставления, какое сопоставление объектов использовать, когда он встречает данные по заданному ключевому пути. В случае примера и связанных с ним данных JSON фактических экземпляров путей task нет, поэтому в этом конкретном примере оператор [objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"task"] не требуется; в другом случае у вас вполне может быть что-то вроде

"task":{"id":10,"name":"Some task", "assigned_user_id":5}

в этом случае он будет необходим. Фактические задачи в потоке JSON сопоставляются из-за [projectMapping mapRelationship:@"tasks" withMapping:taskMapping].

Вы можете использовать RKLogConfigureByName() для проверки того, что делает RestKit — очень полезно. RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace) в этом случае даст вам "пошаговую" логику сопоставления.

person jstevenco    schedule 08.03.2012