SlideShare a Scribd company logo
1 of 34
Download to read offline
Подходы и технологии, 
используемые в разработке 
iOS-клиента Viber 
Кирилл Лашкевич 
Yandex Mobile Camp
Viber 
• >20M зарегистрированных пользоватей в 
России 
• >400M по миру 
• 100M online 
• 220 сотрудников в 9 странах 
• 4.5 года проекту
Статистика iOS проекта 
• 206K SLOC под iOS 
• +50K SLOC сторонних библиотек под iOS 
• +140K SLOC общего кода Viber 
• +300K SLOC медиа-движка WebRTC 
• +120K SLOC аудио/видео кодеков 
• ≈800K строк кода
Agenda 
1. Управление исходным кодом 
2. Сборка проекта 
3. Несколько примеров кода
Работа с репозиториями 
• 1 репозиторий для всего проекта 
• Много репозиториев 
• 12 git origins, >100 с форками
1 репозиторий 
+ - 
• Просто для 
начального этапа 
• Поддерживается 
всеми 
инструментами 
• Разграничения 
доступа 
• Ветки 
• Совместная работа 
• Размер 
• Скорость работы
CocoaPods 
+ - 
• База готовых pods 
для сторонних 
библиотек 
• Возможность 
управления 
приватными 
репозиториями 
• Только для 
проектов под iOS, 
для остальных 
платформ проблема 
остается 
• Практически не 
используем 
сторонние 
библиотеки
Сторонние библиотеки 
• Только в исходных кодах 
• 7 раз подумать стоит ли брать сторонний код 
либо написать самим 
• Быть готовым исправлять баги, адаптировать 
под новые версии ОС и компилятора быстрее 
авторов 
• Приватный форк в github (git-svn для svn)
Git submodules 
• Ссылка на конкретную ревизию внешнего 
репозитория в каталоге основного 
• Что бы получить весь код для сборки: 
git clone … && 
git submodule update --init —update 
• Подходит как для внутренних библиотек так и 
для стороннего кода 
• Работает одинаково на всех платформах
Git subtree 
• Способ добавить внешний репозиторий, либо 
его часть в основной, с сохранением 
возможности обновления в обе стороны 
• Подходит для случаев, когда внешний 
репозиторий активно не взаимодействует с 
upstream 
• Проще в использовании, код из внешнего 
репозитория выглядит как часть основного
RAC Mantle 
LibViber 
Core 
Viber
 iOS 
Media
  
Engine 
DSP 
Codec Codec
Сборка проекта 
• make, cmake, qmake, scons 
• Xcode, xcodebuild: 
• Workspace 
• Project 
• Target
1 Проект 
1 Target
1 Проект 
N Targets
1 Проект 
N подпроектов
1 Workspace 
N проектов
+ external build 
+ external build
Недостатки Xcode 
• Переодически что-нибудь ломают (а иногда и 
чинят) 
• Headermap который сложно отключить 
• Сборка отдельных файлов под разные 
платформы 
• Не все документировано 
• Скорость сборки не максимальная
Немного кода 
• Swift 
• Main thread profiler 
• ReactiveCocoa 
• Mantle
Swift 
• Да, мы используем Swift! 
• 15 строчке скрипта для 
генерации иконки с номером 
версии 
• Для кода приложения не 
раньше Xcode 6.1
Main thread profiler 
• UI обрабатывается в 
главном потоке, он не 
должен блокироваться 
• Каждые 0.1с запускать на 
выполнение блок в 
главном потоке 
• Если выполнение блока 
задерживается — 
уведомление в UI и 
backtrace в лог
while (!NSThread.currentThread.isCancelled) { 
static bool pingTaskIsRunning; 
pingTaskIsRunning = YES; 
dispatch_async(dispatch_get_main_queue(), 
^{ 
pingTaskIsRunning = NO; 
dispatch_semaphore_signal(semaphore); 
}); 
[NSThread sleepForTimeInterval:0.4]; 
if (pingTaskIsRunning) { 
// Уведомление о блокировке 
} 
dispatch_semaphore_wait(semaphore, 
DISPATCH_TIME_FOREVER); 
[NSThread sleepForTimeInterval:0.1]; 
}
ReactiveCocoa 
• Удобная замена KVO 
• Функциональное 
программирование в ObjC 
• Меньше состояния, меньше 
багов 
• Возрастает порог входа 
• Много блоков в коде
RAC(self, label.text) = 
RACObserve(self, name); 
http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt1
[[[[[[[self requestAccessToTwitterSignal] 
then:^RACSignal *{ 
@strongify(self) 
return self.searchText.rac_textSignal; 
}] 
filter:^BOOL(NSString *text) { 
@strongify(self) 
return [self isValidSearchText:text]; 
}] 
throttle:0.5] 
flattenMap:^RACStream *(NSString *text) { 
@strongify(self) 
return [self signalForSearchWithText:text]; 
}] 
deliverOn:[RACScheduler mainThreadScheduler]] 
subscribeNext:^(NSDictionary *jsonSearchResult) { 
NSArray *tweets = [jsonSearchResult[@statuses] 
.rac_sequence map:^(id tweet) { 
return [RWTweet tweetWithStatus:tweet]; 
}].array; 
[self.resultsViewController displayTweets:tweets]; 
} error:^(NSError *error) { 
NSLog(@An error occurred: %@, error); 
}];
self и циклические ссылки 
• self захватывается как сильная ссылка в 
блоке 
• Доступ к ivar происходит через неявный 
self: 
^ { NSLog(@%@, _ivar); }; 
^ { NSLog(@%@, self-_ivar); }; 
• Циклическая ссылка получается при 
сохранении блока в атрибуте объекта
@weakself 
• До вызова блока объект, на который указывает 
self, хранится по слабой ссылке, а во время 
вызова блока — по сильной 
• self называется self 
• Проверяется доступ к ivar внутри блоков 
[RACObserve(self, pttState) 
subscribeNext:@weakselfnotnil(^(NSNumber *state)) { 
self.isRecordingPTT = !!state.intValue; 
} @weakselfend]; 
https://gist.github.com/notorca/9192459
Mantle 
• Слой модели данных для приложения 
• Замена NSDictionary 
• Замена классов состоящих только из 
набора @property 
• Автоматом добавляет основные методы: 
initWithDictionary:, description, debugDescription, 
initWithCoder:, encodeWithCoder:, copyWithZone:, 
isEqual:, hash:
NSDictinary *httpRequestSetup = @{ 
@URL : [NSURL URLWithString:@http....], 
@HTTPMethod : @GET, 
@HTTPHeaders : @{}, 
@HTTPBody : [NSData dataWithString:@], 
@resumable : @(YES), 
@streamBoundary : @---123--- 
@streamBody : [NSData dataWithString:@] 
}; 
• Нет проверки типов 
• Только тонны тестов спасут когда проект 
разрастется
@interface VTMHTTPRequestSetup 
 
@property (nonatomic) NSURL *URL; 
@property (nonatomic) NSString *HTTPMethod; 
@property (nonatomic) NSDictionary *HTTPHeaders; 
@property (nonatomic) NSData *HTTPBody; 
@property (nonatomic) BOOL resumable; 
@property (nonatomic) NSString *streamBoundary; 
@property (nonatomic) NSData *streamBody; 
 
// initWithDictionary:, copyWithZone:, 
// description, debugDescription, 
// initWithCoder:, encodeWithCoder:, 
// isEqual:, hash: 
 
@end
@interface VTMHTTPRequestSetup : MTLModel 
 
@property (nonatomic) NSURL *URL; 
@property (nonatomic) NSString *HTTPMethod; 
@property (nonatomic) NSDictionary *HTTPHeaders; 
@property (nonatomic) NSData *HTTPBody; 
@property (nonatomic) BOOL resumable; 
@property (nonatomic) NSString *streamBoundary; 
@property (nonatomic) NSData *streamBody; 
 
@end 
• Конвертация из/в JSON 
• Конвертация из/в NSManagedObject

More Related Content

What's hot

Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Ontico
 
обзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаобзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаКонстантин Никифоров
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Ontico
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Ontico
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Ontico
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Ontico
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Ontico
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Ontico
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Ontico
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Ontico
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays HighloadYehor Herasymchuk
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Ontico
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на GoAndrey Smirnov
 

What's hot (20)

Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
обзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаобзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторинга
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
 

Viewers also liked

Оптимизация банковских раскодов или лидогенерация для всех
Оптимизация банковских раскодов или лидогенерация для всехОптимизация банковских раскодов или лидогенерация для всех
Оптимизация банковских раскодов или лидогенерация для всехKsenia Kostina
 
PPA продвижение — как платить только за звонки и заявки?
PPA продвижение — как платить только за звонки и заявки?PPA продвижение — как платить только за звонки и заявки?
PPA продвижение — как платить только за звонки и заявки?Shoplist
 
титков ашманов и парт
титков ашманов и парттитков ашманов и парт
титков ашманов и партFinancialStudio
 
лидогенерация Webit
лидогенерация Webitлидогенерация Webit
лидогенерация Webitqwerned
 
Финансовая лидогенерация
Финансовая лидогенерацияФинансовая лидогенерация
Финансовая лидогенерацияDmitry Yuhkhnevich
 
Вебинар amoCRM 2015.11.13
Вебинар amoCRM 2015.11.13Вебинар amoCRM 2015.11.13
Вебинар amoCRM 2015.11.13Directiv
 
презентация лидогенерация Webit fin
презентация лидогенерация Webit finпрезентация лидогенерация Webit fin
презентация лидогенерация Webit finqwerned
 
Юрій Тітков. Крауд маркетинг для мобільних додатків.
Юрій Тітков. Крауд маркетинг для мобільних додатків.Юрій Тітков. Крауд маркетинг для мобільних додатків.
Юрій Тітков. Крауд маркетинг для мобільних додатків.Lviv Startup Club
 
SalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкция
SalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкцияSalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкция
SalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкцияGeeksLab Odessa
 
Лиды нннада... Типовые ошибки создания партнерской программы
Лиды нннада... Типовые ошибки создания партнерской программыЛиды нннада... Типовые ошибки создания партнерской программы
Лиды нннада... Типовые ошибки создания партнерской программыKsenia Kostina
 
Лидогенерация с помощью тизерной рекламы
Лидогенерация с помощью тизерной рекламыЛидогенерация с помощью тизерной рекламы
Лидогенерация с помощью тизерной рекламыAlisa Fursa
 
Как получить "лид"?
Как получить "лид"?Как получить "лид"?
Как получить "лид"?SiteSecure
 
Лидогенерация в кредитной тематике - автоломбард и кредитный брокер
Лидогенерация в кредитной тематике - автоломбард и кредитный брокерЛидогенерация в кредитной тематике - автоломбард и кредитный брокер
Лидогенерация в кредитной тематике - автоломбард и кредитный брокерАлександр Кулик
 
Saas – продукт: лидогенерация и работа с клиентами на примере SEMrush.com
Saas – продукт: лидогенерация и работа с клиентами на примере SEMrush.comSaas – продукт: лидогенерация и работа с клиентами на примере SEMrush.com
Saas – продукт: лидогенерация и работа с клиентами на примере SEMrush.comConformato
 
Как привлечь на сайт посетителей, которые купят
Как привлечь на сайт посетителей, которые купятКак привлечь на сайт посетителей, которые купят
Как привлечь на сайт посетителей, которые купятNetpeak
 
Работа с базой email адресов (сбор, управление, сегментирование)
Работа с базой email адресов (сбор, управление, сегментирование)Работа с базой email адресов (сбор, управление, сегментирование)
Работа с базой email адресов (сбор, управление, сегментирование)Oksana Selendeeva
 
Лидогенерация в социальных медия
Лидогенерация в социальных медияЛидогенерация в социальных медия
Лидогенерация в социальных медияилья голотин
 
Крауд-маркетинг: тонкости организации ручного линбилдинга
Крауд-маркетинг: тонкости организации ручного линбилдингаКрауд-маркетинг: тонкости организации ручного линбилдинга
Крауд-маркетинг: тонкости организации ручного линбилдингаWebline Promotion
 
Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7DrupalSPB
 
Рассылки Whats app
Рассылки Whats app Рассылки Whats app
Рассылки Whats app Pavlovate
 

Viewers also liked (20)

Оптимизация банковских раскодов или лидогенерация для всех
Оптимизация банковских раскодов или лидогенерация для всехОптимизация банковских раскодов или лидогенерация для всех
Оптимизация банковских раскодов или лидогенерация для всех
 
PPA продвижение — как платить только за звонки и заявки?
PPA продвижение — как платить только за звонки и заявки?PPA продвижение — как платить только за звонки и заявки?
PPA продвижение — как платить только за звонки и заявки?
 
титков ашманов и парт
титков ашманов и парттитков ашманов и парт
титков ашманов и парт
 
лидогенерация Webit
лидогенерация Webitлидогенерация Webit
лидогенерация Webit
 
Финансовая лидогенерация
Финансовая лидогенерацияФинансовая лидогенерация
Финансовая лидогенерация
 
Вебинар amoCRM 2015.11.13
Вебинар amoCRM 2015.11.13Вебинар amoCRM 2015.11.13
Вебинар amoCRM 2015.11.13
 
презентация лидогенерация Webit fin
презентация лидогенерация Webit finпрезентация лидогенерация Webit fin
презентация лидогенерация Webit fin
 
Юрій Тітков. Крауд маркетинг для мобільних додатків.
Юрій Тітков. Крауд маркетинг для мобільних додатків.Юрій Тітков. Крауд маркетинг для мобільних додатків.
Юрій Тітков. Крауд маркетинг для мобільних додатків.
 
SalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкция
SalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкцияSalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкция
SalesLab: Марина Никитчук (DataArt) - Лидогенерация. Пошаговая инструкция
 
Лиды нннада... Типовые ошибки создания партнерской программы
Лиды нннада... Типовые ошибки создания партнерской программыЛиды нннада... Типовые ошибки создания партнерской программы
Лиды нннада... Типовые ошибки создания партнерской программы
 
Лидогенерация с помощью тизерной рекламы
Лидогенерация с помощью тизерной рекламыЛидогенерация с помощью тизерной рекламы
Лидогенерация с помощью тизерной рекламы
 
Как получить "лид"?
Как получить "лид"?Как получить "лид"?
Как получить "лид"?
 
Лидогенерация в кредитной тематике - автоломбард и кредитный брокер
Лидогенерация в кредитной тематике - автоломбард и кредитный брокерЛидогенерация в кредитной тематике - автоломбард и кредитный брокер
Лидогенерация в кредитной тематике - автоломбард и кредитный брокер
 
Saas – продукт: лидогенерация и работа с клиентами на примере SEMrush.com
Saas – продукт: лидогенерация и работа с клиентами на примере SEMrush.comSaas – продукт: лидогенерация и работа с клиентами на примере SEMrush.com
Saas – продукт: лидогенерация и работа с клиентами на примере SEMrush.com
 
Как привлечь на сайт посетителей, которые купят
Как привлечь на сайт посетителей, которые купятКак привлечь на сайт посетителей, которые купят
Как привлечь на сайт посетителей, которые купят
 
Работа с базой email адресов (сбор, управление, сегментирование)
Работа с базой email адресов (сбор, управление, сегментирование)Работа с базой email адресов (сбор, управление, сегментирование)
Работа с базой email адресов (сбор, управление, сегментирование)
 
Лидогенерация в социальных медия
Лидогенерация в социальных медияЛидогенерация в социальных медия
Лидогенерация в социальных медия
 
Крауд-маркетинг: тонкости организации ручного линбилдинга
Крауд-маркетинг: тонкости организации ручного линбилдингаКрауд-маркетинг: тонкости организации ручного линбилдинга
Крауд-маркетинг: тонкости организации ручного линбилдинга
 
Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7
 
Рассылки Whats app
Рассылки Whats app Рассылки Whats app
Рассылки Whats app
 

Similar to Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лашкевич

Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsqlAnatoly Popov
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Платформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчикаПлатформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчикаГеоргий Драк
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформуVadim Kruchkov
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаAlexei Smolyanov
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest
 
Серверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBСерверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBStepan Stolyarov
 
Net core and linux in production
Net core and linux in productionNet core and linux in production
Net core and linux in productionAnatoly Popov
 
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)AvitoTech
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012InTRUEdeR
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17MoscowJS
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 

Similar to Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лашкевич (20)

Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Платформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчикаПлатформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчика
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
 
Серверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBСерверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDB
 
Libraries
LibrariesLibraries
Libraries
 
Libraries
LibrariesLibraries
Libraries
 
Net core and linux in production
Net core and linux in productionNet core and linux in production
Net core and linux in production
 
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Sivko
SivkoSivko
Sivko
 

More from Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

More from Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лашкевич

  • 1. Подходы и технологии, используемые в разработке iOS-клиента Viber Кирилл Лашкевич Yandex Mobile Camp
  • 2. Viber • >20M зарегистрированных пользоватей в России • >400M по миру • 100M online • 220 сотрудников в 9 странах • 4.5 года проекту
  • 3. Статистика iOS проекта • 206K SLOC под iOS • +50K SLOC сторонних библиотек под iOS • +140K SLOC общего кода Viber • +300K SLOC медиа-движка WebRTC • +120K SLOC аудио/видео кодеков • ≈800K строк кода
  • 4. Agenda 1. Управление исходным кодом 2. Сборка проекта 3. Несколько примеров кода
  • 5. Работа с репозиториями • 1 репозиторий для всего проекта • Много репозиториев • 12 git origins, >100 с форками
  • 6. 1 репозиторий + - • Просто для начального этапа • Поддерживается всеми инструментами • Разграничения доступа • Ветки • Совместная работа • Размер • Скорость работы
  • 7. CocoaPods + - • База готовых pods для сторонних библиотек • Возможность управления приватными репозиториями • Только для проектов под iOS, для остальных платформ проблема остается • Практически не используем сторонние библиотеки
  • 8. Сторонние библиотеки • Только в исходных кодах • 7 раз подумать стоит ли брать сторонний код либо написать самим • Быть готовым исправлять баги, адаптировать под новые версии ОС и компилятора быстрее авторов • Приватный форк в github (git-svn для svn)
  • 9. Git submodules • Ссылка на конкретную ревизию внешнего репозитория в каталоге основного • Что бы получить весь код для сборки: git clone … && git submodule update --init —update • Подходит как для внутренних библиотек так и для стороннего кода • Работает одинаково на всех платформах
  • 10. Git subtree • Способ добавить внешний репозиторий, либо его часть в основной, с сохранением возможности обновления в обе стороны • Подходит для случаев, когда внешний репозиторий активно не взаимодействует с upstream • Проще в использовании, код из внешнего репозитория выглядит как часть основного
  • 11. RAC Mantle LibViber Core Viber
  • 13.   Engine DSP Codec Codec
  • 14. Сборка проекта • make, cmake, qmake, scons • Xcode, xcodebuild: • Workspace • Project • Target
  • 16. 1 Проект N Targets
  • 17. 1 Проект N подпроектов
  • 18. 1 Workspace N проектов
  • 19. + external build + external build
  • 20.
  • 21. Недостатки Xcode • Переодически что-нибудь ломают (а иногда и чинят) • Headermap который сложно отключить • Сборка отдельных файлов под разные платформы • Не все документировано • Скорость сборки не максимальная
  • 22. Немного кода • Swift • Main thread profiler • ReactiveCocoa • Mantle
  • 23. Swift • Да, мы используем Swift! • 15 строчке скрипта для генерации иконки с номером версии • Для кода приложения не раньше Xcode 6.1
  • 24. Main thread profiler • UI обрабатывается в главном потоке, он не должен блокироваться • Каждые 0.1с запускать на выполнение блок в главном потоке • Если выполнение блока задерживается — уведомление в UI и backtrace в лог
  • 25. while (!NSThread.currentThread.isCancelled) { static bool pingTaskIsRunning; pingTaskIsRunning = YES; dispatch_async(dispatch_get_main_queue(), ^{ pingTaskIsRunning = NO; dispatch_semaphore_signal(semaphore); }); [NSThread sleepForTimeInterval:0.4]; if (pingTaskIsRunning) { // Уведомление о блокировке } dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); [NSThread sleepForTimeInterval:0.1]; }
  • 26. ReactiveCocoa • Удобная замена KVO • Функциональное программирование в ObjC • Меньше состояния, меньше багов • Возрастает порог входа • Много блоков в коде
  • 27. RAC(self, label.text) = RACObserve(self, name); http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt1
  • 28. [[[[[[[self requestAccessToTwitterSignal] then:^RACSignal *{ @strongify(self) return self.searchText.rac_textSignal; }] filter:^BOOL(NSString *text) { @strongify(self) return [self isValidSearchText:text]; }] throttle:0.5] flattenMap:^RACStream *(NSString *text) { @strongify(self) return [self signalForSearchWithText:text]; }] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDictionary *jsonSearchResult) { NSArray *tweets = [jsonSearchResult[@statuses] .rac_sequence map:^(id tweet) { return [RWTweet tweetWithStatus:tweet]; }].array; [self.resultsViewController displayTweets:tweets]; } error:^(NSError *error) { NSLog(@An error occurred: %@, error); }];
  • 29. self и циклические ссылки • self захватывается как сильная ссылка в блоке • Доступ к ivar происходит через неявный self: ^ { NSLog(@%@, _ivar); }; ^ { NSLog(@%@, self-_ivar); }; • Циклическая ссылка получается при сохранении блока в атрибуте объекта
  • 30. @weakself • До вызова блока объект, на который указывает self, хранится по слабой ссылке, а во время вызова блока — по сильной • self называется self • Проверяется доступ к ivar внутри блоков [RACObserve(self, pttState) subscribeNext:@weakselfnotnil(^(NSNumber *state)) { self.isRecordingPTT = !!state.intValue; } @weakselfend]; https://gist.github.com/notorca/9192459
  • 31. Mantle • Слой модели данных для приложения • Замена NSDictionary • Замена классов состоящих только из набора @property • Автоматом добавляет основные методы: initWithDictionary:, description, debugDescription, initWithCoder:, encodeWithCoder:, copyWithZone:, isEqual:, hash:
  • 32. NSDictinary *httpRequestSetup = @{ @URL : [NSURL URLWithString:@http....], @HTTPMethod : @GET, @HTTPHeaders : @{}, @HTTPBody : [NSData dataWithString:@], @resumable : @(YES), @streamBoundary : @---123--- @streamBody : [NSData dataWithString:@] }; • Нет проверки типов • Только тонны тестов спасут когда проект разрастется
  • 33. @interface VTMHTTPRequestSetup @property (nonatomic) NSURL *URL; @property (nonatomic) NSString *HTTPMethod; @property (nonatomic) NSDictionary *HTTPHeaders; @property (nonatomic) NSData *HTTPBody; @property (nonatomic) BOOL resumable; @property (nonatomic) NSString *streamBoundary; @property (nonatomic) NSData *streamBody; // initWithDictionary:, copyWithZone:, // description, debugDescription, // initWithCoder:, encodeWithCoder:, // isEqual:, hash: @end
  • 34. @interface VTMHTTPRequestSetup : MTLModel @property (nonatomic) NSURL *URL; @property (nonatomic) NSString *HTTPMethod; @property (nonatomic) NSDictionary *HTTPHeaders; @property (nonatomic) NSData *HTTPBody; @property (nonatomic) BOOL resumable; @property (nonatomic) NSString *streamBoundary; @property (nonatomic) NSData *streamBody; @end • Конвертация из/в JSON • Конвертация из/в NSManagedObject
  • 35. • Вся работа с CoreData в фоновом потоке • NSManagedObjects - MTLModel • FetchResultController для отслеживания изменений +логика получения конкретных обновившихся полей во время merge NSManagedContext • ReactiveCocoa для связи всего, пересылки из потока в поток и throtlling