Сопоставьте параметры URL с объектами с помощью RESTKit

есть ли способ сопоставить параметры в URL-адресе с результатами?

У меня есть служба отдыха, где пользователь может искать что-то по своему идентификатору. Путь: search/:id Результаты содержат имя и другие свойства, но не идентификатор.

Я мог бы сделать что-то вроде этого:

NSArray *array = mappingResult.array;
for (Item *item in array) {
        [item setId:itemID];
}

но я надеюсь, что есть более приятный способ...

Спасибо за любые подсказки
Xean


person Obenland    schedule 19.08.2013    source источник


Ответы (2)


Вы хотите использовать шаблон пути, указанный в дескрипторе ответа. Затем вы хотите использовать маршрутизацию (RKRoute) и метаданные во время сопоставления. Метаданные включают раздел маршрутизации, который дает доступ к параметрам, извлеченным из пути URL.

Немного информации о метаданных здесь (немного не хватает документации).

В своем сопоставлении вы хотите использовать:

@metadata.routing.parameters.id

В качестве пути исходного ключа сопоставления.


Чтобы маршрутизация работала, вам нужно добавить маршрут в менеджер объектов:

[manager.router.routeSet addRoute:...

Затем вам нужно сделать запрос так, чтобы маршрут использовался, например getObjectsAtPathForRouteNamed:object:parameters:success:failure:.

person Wain    schedule 20.08.2013
comment
Это правильный путь. Моя проблема в том, что @metadata.routing не существует. - person Obenland; 20.08.2013
comment
Вы используете RKRoute? Вам нужно будет показать свои сопоставления, дескрипторы ответов и конфигурацию маршрута, чтобы получить дополнительную помощь... - person Wain; 20.08.2013
comment
Мой маршрут [RKRoute routeWithClass:[Item class] pathPattern:@"search/:id" method:RKRequestMethodGET];. ResponseDescriptor такой же, как написал @micha-mazaheri. Я добавил отображение из @Wain с помощью addAttributeMappingsFromDictionary: - person Obenland; 20.08.2013
comment
Итак, вы создаете экземпляр маршрута. Вы устанавливаете его в диспетчере объектов и как запускаете загрузку (используя маршрут)? - person Wain; 20.08.2013
comment
Да: [objectManager addResponseDescriptorsFromArray:[Item responseDescriptors]];. Я звоню [objectManager getObjectsAtPath:path parameters:nil success:(...) failure:(...)];, чтобы начать запрос. Я отлаживал, чтобы получить ключи метаданных в RKMappingOperation. Отображение работает, за исключением @metadata. Путь представляет собой строку типа search/123. - person Obenland; 20.08.2013
comment
Поле routing будет добавлено, только если путь равен нулю (см. RKObjectManager, строка 580). Так это не может работать, верно? - person Obenland; 20.08.2013
comment
С getObjectsAtPathForRouteNamed:object:parameters:success:failure: работает отлично! Благодарю вас! - person Obenland; 20.08.2013

Вероятно, вам нужно указать pathPattern и keyPath вашего дескриптора ответа::

RKResponseDescriptor *responseDescriptor =
  [RKResponseDescriptor
   responseDescriptorWithMapping:itemMapping
   method:RKRequestMethodAny
   pathPattern:@"search/:id"
   keyPath:@"item"
   statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
person Micha Mazaheri    schedule 20.08.2013