3. Что такое RestKit?
• Фреймворк для взаимодействия с RESTful API
• Разрабатывается с 2011 года
4. Что такое RestKit?
• Фреймворк для взаимодействия с RESTful API
• Разрабатывается с 2011 года
• 7750 🌟 на GitHub
5. Что такое RestKit?
• Фреймворк для взаимодействия с RESTful API
• Разрабатывается с 2011 года
• 7750 🌟 на GitHub
• 4 коммита от Сергея Крапивенского 👸
7. Терминология
• mapping – преобразование данных из одного
представления в другое
• source – объект, из которого производится
мэппинг
8. Терминология
• mapping – преобразование данных из одного
представления в другое
• source – объект, из которого производится
мэппинг
• destination – объект, в который производится
мэппинг
9. Терминология
• mapping – преобразование данных из одного
представления в другое
• source – объект, из которого производится
мэппинг
• destination – объект, в который производится
мэппинг
• АПИ – лень выговаривать ЭйПиАй
12. Зачем он мне?
• API клиент и мэппинг в одном флаконе
• Упрощает жизнь при работе с плохим JSON
13. Зачем он мне?
• API клиент и мэппинг в одном флаконе
• Упрощает жизнь при работе с плохим JSON
• Легкий мэппинг напрямую в Core Data
14. Зачем он мне?
• API клиент и мэппинг в одном флаконе
• Упрощает жизнь при работе с плохим JSON
• Легкий мэппинг напрямую в Core Data
• Мэппинг можно прикрутить к другому сетевому
стеку
15. Зачем он мне?
• API клиент и мэппинг в одном флаконе
• Упрощает жизнь при работе с плохим JSON
• Легкий мэппинг напрямую в Core Data
• Мэппинг можно прикрутить к другому сетевому
стеку
• Упрощает тестирование мэппинга
28. RKPropertyMapping
• RKObjectMapping – контейнер для объектов
класса RKPropertyMapping, описывающих
мэппинг одного поля объекта-источника
• RKAttributeMapping – мэппинг простого
значения (строка, число и т.д.)
29. RKPropertyMapping
• RKObjectMapping – контейнер для объектов
класса RKPropertyMapping, описывающих
мэппинг одного поля объекта-источника
• RKAttributeMapping – мэппинг простого
значения (строка, число и т.д.)
• RKRelationshipMapping – мэппинг составных
объектов
30. Пример
{ "applications": [
{ "title": "Афиша-Рестораны",
"body": "Самый быстрый и удобный способ выбрать в какой ресторан
или бар пойти",
"author": "Илья Пучка",
"publication_date": "13/11/2014"
},
{ "title": "Redigo",
"body": "Удобный компактный гид по странам мира от Австралии до
Японии в вашем телефоне",
"author": "Стас Цыганов",
"publication_date": "30/01/2015"
}]
}
33. RKObjectMapping
То же самое что и:
[appMapping addPropertyMapping:
[RKAttributeMapping attributeMappingFromKeyPath:@"title"
toKeyPath:@"title"]];
[appMapping addPropertyMapping:
[RKAttributeMapping attributeMappingFromKeyPath:@"body"
toKeyPath:@"body"]];
и т.д.
34. Приведение типов
• NSString -> NSDate с помощью NSDateFormatter
• NSString -> NSURL
• NSString -> NSNumber
• NSString с булевыми значениями (YES, NO,
false и тд) -> NSNumber
• NSNumber -> NSDate
• предустановленные NSDateFormatter’ы
• и многое другое (свое собственное
преобразование можно задать блоком)
35. Связь запроса и мэппинга
• Для связи запроса с мэппингом есть
специальный класс - RKResponseDescriptor
• Для сериализации объектов перед
отправкой на сервер используется похожий
класс RKRequestDescriptor
44. Мэппинг графа объектов
{
”applications": [
{
"title": "Redigo",
"body": "Удобный компактный гид по странам мира от Австралии до
Японии в вашем телефоне",
"author": {
"name": "Стас Цыганов",
"email": "secretStasEmail@rambler-co.ru"
},
"publication_date": "30/01/2015"
}
]
}
50. Мэппинг кривого JSON
Мэппинг без KVC:
[
{ "title": "Redigo",
"body": "Удобный компактный гид по странам мира от
Австралии до Японии в вашем телефоне",
"author": {
"name": "Стас Цыганов",
"email": "secretStasEmail@rambler-co.ru"
},
"publication_date": “30/01/2015"
}
]
66. RKDynamicMapping
• заранее неизвестно какой мэппинг
потребуется
• нужный RKObjectMapping подбирается при
анализе полученных данных
• выбор осуществляется с помощью блока
67. RKDynamicMapping
• заранее неизвестно какой мэппинг
потребуется
• нужный RKObjectMapping подбирается при
анализе полученных данных
• выбор осуществляется с помощью блока
• или при анализе аттрибута в JSON с
помощью класса RKObjectMappingMatcher
78. Цикл RKObjectRequestOperation
2) в случае успеха инициализируется
RKMapperResponseOperation и обрабатывает response. на
вход ей подается:
• NSURLRequest
• NSHTTPURLResponse
• response data (NSData)
• массив дескрипторов
80. Цикл RKObjectRequestOperation
4) если объект можно десериализовать, то создается
RKMapperOperation с полученным объектом и словарем, где
ключом является keyPath, а значением – мэппинг
@{ "applications" : appMapping }
82. Пример
Исходный словарь:
{ "applications": [
{ "title": "Афиша-Рестораны",
"body": "Самый быстрый и удобный способ выбрать в какой ресторан или бар
пойти",
"author": "Илья Пучка",
"publication_date": "13/11/2014"
},
{ "title": "Redigo",
"body": "Удобный компактный гид по странам мира от Австралии до Японии в
вашем телефоне",
"author": "Стас Цыганов",
"publication_date": "30/01/2015"
}]
}
83. Пример
После вызова у него valueForKeyPath:@"applications":
NSArray
{
title = "Афиша-Рестораны”;
body = "Самый быстрый и удобный способ выбрать в какой ресторан или бар
пойти”;
author = "Илья Пучка";
publication_date = "13/11/2014";
},
{
title = "Redigo";
body = "Удобный компактный гид по странам мира от Австралии до Японии в
вашем телефоне”;
author = "Стас Цыганов";
publication_date = "30/01/2015";
}
92. Как мэппить в Core Data?
• создать стек Core Data средствами RestKit
93. Как мэппить в Core Data?
• создать стек Core Data средствами RestKit
• вместо RKObjectMapping использовать
RKEntityMapping
94. Создание стека Core Data
NSURL *modelURL = /* model URL */;
NSManagedObjectModel *managedObjectModel =
[[NSManagedObjectModel alloc]
initWithContentsOfURL:modelURL];
95. Создание стека Core Data
RKManagedObjectStore *managedObjectStore =
[[RKManagedObjectStore alloc]
initWithManagedObjectModel:managedObjectModel];
96. Создание стека Core Data
[managedObjectStore createPersistentStoreCoordinator];
NSPersistentStore __unused *persistentStore =
[managedObjectStore addInMemoryPersistentStore:&error];
NSAssert(persistentStore, @"Failed to add persistent store: %@", error);
97. Создание стека Core Data
[managedObjectStore createManagedObjectContexts];
[RKManagedObjectStore setDefaultStore:managedObjectStore];
98. Создание стека Core Data
[NSPersistentStoreCoordinator
MR_setDefaultStoreCoordinator:managedObjectStore.persistentStoreCoordinat
or];
[NSManagedObjectContext
MR_setRootSavingContext:managedObjectStore.persistentStoreManagedObje
ctContext];
[NSManagedObjectContext
MR_setDefaultContext:managedObjectStore.mainQueueManagedObjectConte
xt];
99. Мэппинг в Core Data
{
"applications": [
{ "title": "Афиша-Рестораны",
"body": "Самый быстрый и удобный способ выбрать
в какой ресторан или бар пойти",
"author": "Илья Пучка",
"publication_date": "13/11/2014",
"id": 12
}
]
}