SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
Как не стать жертвой
бекендеров
Ирина Дягилева
RAMBLER&Co
Нужна ли валидация ответа сервера?
2
3
Crash-free
4
5
Нужен контракт
между клиентом и сервером
и его валидация
6
План
• Валидация ответа сервера
• JSON-схема
• Библиотеки
• Время валидации
• Полезные инструменты
7
LiveJournal
@implementation RegistrationResponseValidator
- (NSError *)validateServerResponse:(id)response {
NSError *resultError = nil;
return resultError;
}
@end
if (![super validateResponseIsErrorClass:response error:&resultError]) {
return resultError;
}
if(![super validateResponseIsDictionaryClass:response error:&resultError]) {
return resultError;
}
if (response[@"access_token"] == nil || response[@"displayName"] == nil || response[@"id"] == nil) {
resultError = ...; // создание ошибки валидации
}
8
Афиша
- (NSError *)validateResponseObject:(id)responseObject
mapping:(EKManagedObjectMapping *)mapping {
return nil;
}
NSError *validationError = [self validateResponseObject:responseObject];
if (validationError) {
return [self validationError];
}
NSArray *primaryKeys = mapping.rca_primaryKeys;
if (primaryKeys) {
for (NSString *primaryKey in primaryKeys) {
EKPropertyMapping *propertyMapping = [self propertyMappingForPrimaryKey:primaryKey
mapping:mapping];
if (!responseObject[propertyMapping.keyPath]) {
return [self validationError];
}
}
}
9
JSON Schema
http://json-schema.org/
это JSON
набор инструкций для описания
структуры JSON документов
10
Типы объектов
JSON JSON Schema
string string
number number/integer
object object
array array
true true
false false
null null
11
Примеры json-схем
{ "type": "boolean" }
true
12
false
"true"
30
Строковые типы
{
"type": "string",
"minLength": 7,
"maxLength": 9
}
13
"12345678"
"#FF0000"
"12345"
true
{
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
}
Строковые типы
14
"#FFFFFf22"
"#3C2FCB"
"FFFFFf22"
"#3C2FCB00"
14
Строковые типы
{
"type": "string",
"format": "email"
}
"email", "date-time", "hostname", "ipv4", "ipv6", "uri"
15
"i.dyagileva@rambler-co.ru" "i.dyagileva"
Числовые типы
{
"type": "integer",
"minimum": 200,
"maximum": 500,
"exclusiveMinimum": true,
"multipleOf": 5
}
16
205
500
200
104
Перечисления
{
"type": "string",
"enum": [ "red", "green", "blue" ]
}
17
"red"
"blue"
"pink"
"#FFFFFF"
Массивы
{
"type": "array",
"items": {
"type": ["string", "integer"]
},
"minItems": 2,
"maxItems": 3,
"uniqueItems": true
}
18
["a", 2]
[4, 5, 6]
[1, 2, 1]
["a", "b", "c", "d"]
Объекты
{
"type": "object",
"properties": {
"articleID": {
"type": "string"
},
"title": {
"type": "string"
},
"subtitle": {
"type": "string"
}
},
"required": ["articleID","title"],
}
{

"articleID": "1",

"title": "Заголовок",

"subtitle": "Подзаголовок"

}
{

"articleID": "1",

"subtitle": "Подзаголовок"

}
19
Объекты
{
"type": "object",
"properties": {
"articleID": {
"type": "string"
},
"title": {
"type": "string"
},
"subtitle": {
"type": "string"
}
},
"required": ["articleID","title"],
"additionalProperties": false
}
{

"articleID": "1",

"title": "Заголовок",

"subtitle": "Подзаголовок"

}
{

"articleID": "1",

"title": "Заголовок",

"subtitle": "Подзаголовок",

"description": "Описание"

}
20
Определения
{
"type": "object",
"properties": {
"backgroundColor": {
"$ref": "#/definitions/color"
},
"foregroundColor": {
"$ref": "#/definitions/color"
}
},
"definitions": {
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
}
}
}

21
{

"backgroundColor": "#FFFFFF",

"foregroundColor": "#FF0000"

}
{

"backgroundColor": "FFFFFF",

"foregroundColor": "#FF"

}
Композиция
{
"type": "array",
"items": {
"allOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "integer",
"multipleOf": 5
}
]
}
}
22
[5, 15]
[-4, 5]
[0, 0]
[1, 8]
Композиция
{
"type": "array",
"items": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "integer",
"multipleOf": 5
}
]
}
}
23
[-5, 5]
[-4, 5]
[1, 8]
[1, "8"]
Композиция
{
"type": "array",
"items": {
"oneOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "integer",
"multipleOf": 5
}
]
}
}
24
[1, 8]
[0, 0]
[1, -5]
[1, -4]
Композиция
{
"type": "object",
"properties": {
"likeValue": { "type": "boolean" },
"place": { "type": "string" },
"event": { "type": "string" }
},
"required": ["likeValue"] ,
"oneOf": [
{ "required": ["place"] },
{ "required": ["event"] }
]
}
25
{

"likeValue": true,

"event": "event",

}
{

"likeValue": true,

"event": "event",

"place": "place"

}
{ 

"likeValue": true 

}
Отрицание
{
"type": "array",
"items": {
"not": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "integer",
"multipleOf": 5
}
]
}
}
}
26
[-1, -4]
[-1, -5]
[-8, -8]
[1, -4]
Объявление схемы
{
"$schema": "http://json-schema.org/draft-04/schema#",
}
27
"id": "http://domain.com/schemas/myschema.json"
{
}
"$schema": "http://json-schema.org/draft-04/schema#",
Объявление схемы
28
"id": "http://domain.com/schemas/myschema.json"
Валидатор
29
/**
Протокол валидатора ответа сервера
*/
@protocol ROSResponseValidator <NSObject>
- (BOOL)validateResponse:(id)response
withSchema:(NSDictionary *)schema
error:(NSError **)error;
@end
30
/**
Протокол поставщика json-схем
*/
@protocol ROSJSONSchemaProvider <NSObject>
- (NSDictionary *)sectionsSchema;
- (NSDictionary *)articleSchema;
@end
31
Библиотеки ObjC
• KiteJSONValidator 39
• JSONTools 41
• JSONSchemaValidation 14
32
Библиотеки Swift
• JSONSchema 96
33
Время валидации
34
3 %
12 %
8 %
77 %
Скачивание
Валидация
Маппинг
Понсомизация
Запрос списка секций
ОПЕРАЦИЯ ВРЕМЯ (С)
Скачивание 0,2012
Валидация 0,0215
Маппинг 0,0323
Понсомизация 0,0069
Время валидации
35
4 %
11 %
30 %
55 %
Скачивание
Валидация
Маппинг
Понсомизация
Запрос тела статьи
ОПЕРАЦИЯ ВРЕМЯ (С)
Скачивание 0,1040
Валидация 0,0560
Маппинг 0,0217
Понсомизация 0,0071
Полезные ссылки и
инструменты
Документация http://json-schema.org/
37
Онлайн-валидатор http://www.jsonschemavalidator.net
38
Онлайн-генератор http://jsonschema.net/
39
Генератор JSON-моков http://json-schema-faker.js.org
40
Итоги
• Предотвращение ошибок и падений приложения
• Документирование структур данных,
стандартизация
• Помощь при тестировании
• Генерация моков
41
Контакты
ivdyagileva@gmail.com
ivdyagileva
https://www.linkedin.com/in/dyagileva
https://github.com/idva

Weitere ähnliche Inhalte

Was ist angesagt?

Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
Media Gorod
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
DrupalCampDN
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
Technopark
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf Conference
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
Magecom Ukraine
 
Все дороги ведут в Checkout
Все дороги ведут в CheckoutВсе дороги ведут в Checkout
Все дороги ведут в Checkout
Magecom Ukraine
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
Alexander Makarov
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
Noveo
 

Was ist angesagt? (20)

Построение индексов Redis
Построение индексов RedisПостроение индексов Redis
Построение индексов Redis
 
Контрактное программирование
Контрактное программированиеКонтрактное программирование
Контрактное программирование
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Стажировка-2015. Разработка. Занятие 14. Twitter Flight
Стажировка-2015. Разработка. Занятие 14. Twitter FlightСтажировка-2015. Разработка. Занятие 14. Twitter Flight
Стажировка-2015. Разработка. Занятие 14. Twitter Flight
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 
Все дороги ведут в Checkout
Все дороги ведут в CheckoutВсе дороги ведут в Checkout
Все дороги ведут в Checkout
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 
Server optimization
Server optimizationServer optimization
Server optimization
 

Andere mochten auch

Andere mochten auch (17)

RDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDKRDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDK
 
RDSDataSource: OCLint
RDSDataSource: OCLintRDSDataSource: OCLint
RDSDataSource: OCLint
 
Rambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOS
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по Dip
 
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложенииRambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101
 
Rambler.iOS #5: Разбираем Massive View Controller
Rambler.iOS #5: Разбираем Massive View ControllerRambler.iOS #5: Разбираем Massive View Controller
Rambler.iOS #5: Разбираем Massive View Controller
 
Rambler.iOS #6: Не рычите на pbxproj
Rambler.iOS #6: Не рычите на pbxprojRambler.iOS #6: Не рычите на pbxproj
Rambler.iOS #6: Не рычите на pbxproj
 
RDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRDSDataSource: YapDatabase
RDSDataSource: YapDatabase
 
Rambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPERRambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPER
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App Thinning
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейса
 
Rambler.iOS #4: Создание модульных приложений на примере Рамблер.Кассы
Rambler.iOS #4: Создание модульных приложений на примере Рамблер.КассыRambler.iOS #4: Создание модульных приложений на примере Рамблер.Кассы
Rambler.iOS #4: Создание модульных приложений на примере Рамблер.Кассы
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
RDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperiencedRDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperienced
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 

Ähnlich wie Rambler.iOS #8: Как не стать жертвой бэкендеров

Практическое применение MongoDB Aggregation Framework
Практическое применение MongoDB Aggregation FrameworkПрактическое применение MongoDB Aggregation Framework
Практическое применение MongoDB Aggregation Framework
Денис Кравченко
 
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин ИльяDUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
it-people
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
BlackFan
 
KnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-ОнлайнKnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-Онлайн
2ГИС Технологии
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
dva
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 

Ähnlich wie Rambler.iOS #8: Как не стать жертвой бэкендеров (20)

Практическое применение MongoDB Aggregation Framework
Практическое применение MongoDB Aggregation FrameworkПрактическое применение MongoDB Aggregation Framework
Практическое применение MongoDB Aggregation Framework
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
Apollo GraphQL Federation
Apollo GraphQL FederationApollo GraphQL Federation
Apollo GraphQL Federation
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
 
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин ИльяDUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
KnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-ОнлайнKnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-Онлайн
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Yserver
YserverYserver
Yserver
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтенд
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 

Mehr von RAMBLER&Co

Mehr von RAMBLER&Co (15)

RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVM
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
 
Rambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memoryRambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memory
 
RDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграммRDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграмм
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
 
Rambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектураRambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектура
 
Rambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCore
 
RDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOSRDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOS
 
RDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwiftRDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwift
 
Rambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуйRambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуй
 
Rambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination DemystifiedRambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination Demystified
 
Rambler.iOS #5: TDD и VIPER
Rambler.iOS #5: TDD и VIPERRambler.iOS #5: TDD и VIPER
Rambler.iOS #5: TDD и VIPER
 
Rambler.iOS #5: Переходы и передача данных между VIPER модулями
Rambler.iOS #5: Переходы и передача данных между VIPER модулямиRambler.iOS #5: Переходы и передача данных между VIPER модулями
Rambler.iOS #5: Переходы и передача данных между VIPER модулями
 
Rambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la RamblerRambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la Rambler
 

Rambler.iOS #8: Как не стать жертвой бэкендеров