Как не отображать ответ RestKit?

Я использую RestKit для взаимодействия с REST API. Для некоторых действий, таких как HTTP PUT/POST/DELETE, меня интересует только код состояния ответа (200 или 500 и т. д.), и мне не нужны данные ответа, даже если API отправляет данные обратно.

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


person yichen    schedule 11.05.2013    source источник


Ответы (3)


Нет, поскольку ошибка предполагает, что вам нужен определенный дескриптор ответа. Он не должен быть сложным (он может отображать один элемент данных, например флаг состояния, в NSDictionary).

Не беспокойтесь о производительности, пока у вас нет для этого оснований (профилирование показывает проблему).

Тем не менее, наиболее эффективным способом работы RestKit (во время выполнения) является отсутствие нескольких дескрипторов ответов для поиска, поэтому будьте как можно более конкретными с шаблонами путей и ключевыми путями.

person Wain    schedule 12.05.2013

Мое решение состояло в том, чтобы просто использовать сопоставление для NSObject

RKObjectMapping * emptyMapping = [RKObjectMapping mappingForClass:[NSObject class]];
RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:emptyMapping
                                                                                         method:RKRequestMethodPOST
                                                                                    pathPattern:API_SURVEY_UPLOAD keyPath:nil
                                                                                    statusCodes:[NSIndexSet indexSetWithIndex:200]];
[objectManager addResponseDescriptor:responseDescriptor];
person deepwinter    schedule 19.09.2013
comment
Да, это работает, но RestKit по-прежнему регистрирует ошибку (без сбоев), ошибку сопоставления dding: не найдены отображаемые значения для любого из атрибутов или сопоставлений отношений. Нет ли чего-то более элегантного? - person Andy Obusek; 31.12.2013
comment
Вместо этого используйте [NSNull class], это должно удалить предупреждение - person Gabriel Cartier; 30.07.2014

Если вам не нужно сопоставлять данные ответа с объектами или сопоставлять объекты с параметрами запроса, вам может быть интересно использовать AFHTTPClient, который в любом случае используется в RestKit 0.20. Вы можете получить доступ к объекту AFHTTPClient, который использует сам RestKit, поэтому вам не нужно заново настраивать базовый URL-адрес или заголовки аутентификации и т. д.

Вот простой пример GET:

[[[RKObjectManager sharedManager] HTTPClient] getPath:@"http://example.com"
                                           parameters:nil
                                              success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                                  // handle success
                                              }
                                              failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                                  // response code is in operation.response.statusCode
                                              }];
person nioq    schedule 14.05.2013
comment
Хотя это хороший обходной путь, вам все равно придется вручную удалить объект из основных данных после успешного выполнения запроса, что приведет к потере части мощности Reskit. Я все еще проголосовал, но ответ выше с [классом NSNull] кажется лучшим ответом. - person Gabriel Cartier; 30.07.2014
comment
На самом деле, поскольку в этом подходе используется AFHTTPClient, ответ не будет сопоставлен ни с чем в основных данных, поэтому после успеха ничего не нужно удалять вручную. Однако у использования объекта HTTPClient из RestKit есть новый недостаток: в AFNetworking 2.0 больше нет AFHTTPClient. Хотя RestKit по-прежнему использует AFNetworking 1.3, он, вероятно, в конечном итоге будет обновлен, и указание на устаревший HTTPClient, вероятно, добавит усилий по миграции позже. - person nioq; 30.07.2014
comment
Плохо, я имел в виду, что сопоставление не будет выполнено, поэтому вам придется делать это вручную. Не обращайте внимания на комментарий об удалении (я слишком увлекся своим кодом), я имел в виду именно то, что вы сказали. - person Gabriel Cartier; 30.07.2014