Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

RestKit — изложение одной из вероятностей

Anna | 2.07.2014 | нет комментариев

Давным-давно подметил, что на прогре нет ни одной статьи о такой восхитительной библиотеке как 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
  • работа с многостараничными запросами (пагинация)
  • больше трудны маппинг с применение нескольких сущностей в одном запросе
  • и др.

Каждого добродушного! Мир!

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB