iOS RestKit для чего нужен метод [mappingProvider setMapping: forKeyPath:]? - PullRequest
1 голос
/ 07 марта 2012

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

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

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

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

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

Должно ли @ "task" быть @ "tasks"?

@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

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

1 Ответ

1 голос
/ 09 марта 2012

Метод RKObjectMappingProvider setMapping:forKeyPath: указывает провайдеру сопоставления, какой объект сопоставления использовать, когда он встречает данные по заданному ключевому пути.В случае примера и связанных с ним данных JSON фактических экземпляров task keypaths нет - так что в этом конкретном примере оператор [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) в этом случае даст вам «удар за ударом» логики сопоставления.

...