RestKit — описание одной из возможностей

от автора

Предыстория

Давно заметил, что на хабре нет ни одной статье о такой замечательной библиотеке как RestKit, написанной на Objective-C и предоставляющая прекрасные возможности для работы с RESTful-сервисами. Поэтому и пришла идея опубликовать краткое описание некоторых возможностей библиотеки, тем более что уже вышла совершенно новая её версия использующая за основу AFNetworking библиотеку для работы с HTTP. В статье описывается одна из важнейших для меня функциональностей — маппинг объектов.

Процесс установки библиотеки подробно описан на на странице проекта на GitHub’е. Так же библиотека доступка в Pod’ах:

$ cat Podfile platform :ios, '5.0'  pod 'RestKit', '~> 0.20.0pre' 

Преступим к делу

Обойдёмся без теории, ибо статья всё-таки для тех, кто понимает, хотя бы, что такое REST и зачем он нужен.

Инициализация

При старте приложения необходимо установить начальные параметры для синглтонов работающих с HTTP и занимающихся мапингом объектов:

NSURL *baseURL = [NSURL URLWithString:kServerHost]; AFHTTPClient* client = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client]; [RKObjectManager setSharedManager:objectManager]; 
Маппинг объектов

Для начала нам необходимо описать класс в котором будут храниться данные (куда будут мапиться):

@interface TaskListSuccess : NSObject  @property(nonatomic, copy) NSString *created_at; @property(nonatomic, copy) NSString *updated_at; @property(nonatomic, copy) NSString *user_id; @property(nonatomic, copy) NSString *ID; @property(nonatomic, copy) NSString *title; @property(nonatomic, copy) NSString *time;  @end 

Далее необходимо добавить правило для ответов по каким запросам будет использоваться данный класс и по какому правилу мапятся объекты:

RKObjectMapping* successAuthResult = [RKObjectMapping mappingForClass:[TaskListSuccess class]]; [successAuthResult addAttributeMappingsFromDictionary:@{ // задаются оссоциации полей JSON(XML) к параметрам класса      @"created_at": @"created_at",      @"updated_at": @"updated_at",      @"user_id": @"user_id",      @"id": @"ID",      @"title": @"title",      @"time": @"time", }];   NSIndexSet *successStatusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Набор статус-кодов, при которых запрос является успешно выполненым.      RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:successAuthResult                                                                                       pathPattern:@"tasks"                                                                                             keyPath:nil                                                                                      statusCodes:successStatusCodes]; [[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor]; 

Параметр pathPattern класса RKResponseDescriptor описывает шаблон пути, для маппинга которого будет использоваться наш класс.
Далее необходимо отправить сам запрос:

RKObjectManager *objectManager = [RKObjectManager sharedManager];  [objectManager getObject:nil path:@"tasks" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {        //Тут происходит обработка данных        ... } failure:^(RKObjectRequestOperation *operation, NSError *error) {        //Тут необходимо обрабатывать ошибки        ... }]; 

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

RKObjectManager *objectManager = [RKObjectManager sharedManager]; NSMutableURLRequest *urlRequest = [objectManager requestWithObject:nil method:RKRequestMethodPOST path:@"tasks" parameters:nil]; [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];      RKObjectRequestOperation *operation = [objectManager objectRequestOperationWithRequest:urlRequest success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {        //Тут происходит обработка данных        ... } failure:^(RKObjectRequestOperation *operation, NSError *error) {        //Тут необходимо обрабатывать ошибки        ... }];      [objectManager enqueueObjectRequestOperation:operation]; 

Объект класса RKObjectRequestOperation содежит все возможные параметры, которые мы можем устанавливать как нам угодно.

Outro

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

Возможности:

  • работа с CoreData
  • работа с многостараничными запросами (пагинация)
  • более сложны маппинг с использование нескольких сущностей в одном запросе
  • и др.

Всего доброго! Мир!

ссылка на оригинал статьи http://habrahabr.ru/post/172233/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *