SlideShare a Scribd company logo
1 of 40
Download to read offline
Promises
Поговорим о промисах

• Какие проблемы стояли перед создателями?
• Что это и зачем они нужны?
• Создадим собственные промисы
• Используем их в демо-проекте
• Рассмотрим их преимущества и недостатки
Кто придумал промисы?

Карл Хьюитт
Барбара Лисков
Дэниэл 

Фридман
Проблемы

• Уменьшение задержки
при вычислениях на
удаленных машинах
• Необходимость
максимально
использовать
возможности систем с
множеством процессоров
Идеи

• Распараллелить вычисления
• Переиспользовать получающийся
результат
АProcess 1: B+
АProcess 2: C+
Process 3:
Future
A
Future
A
Future
B
Future
C
Process Queue Result
Future A
Result
A
Result
A
Futures 

(H. Baker, C. Hewitt)
Fork 1:
Fork 2:
Queue:
Promises 

(B. Liskov, L. Shira)
Record
Grade
Record
Grade
Record
Grade
Promise
Student A
Promise
Student B
Promise
Student C
Print

Student A
Print

Student B
Print

Student C
DataBase:
Стандартная модель
Background:
Main:
Promise
Future Show Picture
Download
Picture
Picture
Как это могло бы выглядеть в коде?
let downloadPromise = Promise<UIImage>()
let downloadFuture = downloadPromise.future
downloadFuture
.then { image in
self.imageView.image = image
}
.error { err in

…
}
downloadPromise.resolve(image)
Разные реализации в разных языках

• С++: promise + future
• Scala: promise + future
• Javascript: только promise
• Swift: нет в стандартной библиотеке

в PromiseKit - только Promise
Для нашей реализации

Promise == Future
Будем использовать единую сущность
Основные Use-Cases
Последовательные

операции:
Параллельные 

операции:
Record Promise
Bank
Backend
Upload Promise Show alert
Local
Backend
Combined
Promise
Show user
profile
Последовательные операции
func record() -> Promise<RecordSequence>
func upload(sequence: RecordSequence) -> Promise<Void>
record.then(upload).then { // code showing alert }
… а как бы это выглядело с callback’ами
record { recording in
upload(recording) { result, error in
if let result = result { // code showing alert }
// error handling
}
}
Параллельные операции
func bankUserInfo() ->
Promise<BankUserInfoConfiguration>
func localBackendUserInfo() ->
Promise<LocalBackendUserInfoConfiguration>
combine(localBackendUserInfo, bankUserInfo)
.then { local, bank in
…
show(userInfoConfiguration)
}
Создадим собственные
промисы!
Promise
Спецификация
Операции выполняются
сразу же после создания
Можно записать
результат один раз
Ошибка прерывает
выполнение всей
Выполняется на
произвольной очереди
Метод combine и другие
Метод then - цепочка
промисов
В любой
момент можно
получить
доступ к
результату
Под капотом
var result: Result<T>?
var handlers: [PromiseHandler<T>] = []
let queue = DispatchQueue(label: "promise.queue",
attributes: .concurrent)
Конструктор
let promise = Promise<Int> { resolve, reject in
resolve(someValue)
}
Closure, которые дергают внутренние методы Promise
Реализация конструктора
init(closure: PromiseClosure<T>) {
closure(resolve, receivedError)
}
func resolve(_ parameter: T) {
guard result == nil else { return }
result = .resolved(parameter)
handlers.forEach { $0(result!) }
}
Выполняетс
я сразу

после
создания
Метод then
downloadPromise.then { object in
return something(object)
}
нужно продумать несколько вариаций:
например, then принимает другой promise в
качестве параметра
Реализация метода then
func then(onQueue q: DispatchQueue, closure: (T) throws -> U)
-> Promise<U> {
}
return Promise<U> { resolve, reject in
}
self.addHandler { result in
q.async {
switch result {
case .resolved(let parameter):
resolve(try closure(parameter))
case .rejected(let error):
reject(error)
}
}
}
Аналогичная реализация
метода error
Делегаты - отдельная история

Сложно обернуть в callback
Как нам преобразовать их
в Promise?
Ответ: передаем значение в Promise извне
Делегаты
typealias PromiseTuple<T>
(promise: Promise<T>,
resolve: (T) -> (),
reject : (Error) -> ())
self.delegatePromise = Promise.promiseTuple()
func delegateMethod() {
delegatePromise.resolve(response)
}
Метод combine
combine([promise1, promise2]).then { results in
…
print(results)
}
воспользуемся DispatchGroup
Метод combine
let resultGroup = DispatchGroup()
var objects: [T] = []
let promiseTuple = Promise<[T]>.promiseTuple()
resultGroup.enter()
promise.then { value in
resultGroup.leave()
objects.append(value)
...
}
.error { err in
promiseTuple.reject(err)
}
func combine<T>(q: DispatchQueue,
promises: [Promise<T>]) -> Promise<[T]>
Для каждого promise
Combine (завершение)
resultGroup.notify(queue: q) {
promiseTuple.resolve(objects)
}
return promiseTuple.promise
Метод combine возвращает promise сразу же,
до завершения вычислений
Иные методы

• when: аналогично combine
• after: DispatchQueue.asyncAfter
• отмена promises == вызов ошибки
Применим знания на
практике!
Use case No. 1

Изменение
положения девайса
Изменение бита
Use case No. 2

Изменение позиции
секвенсора
Изменение UI Проигрывание звука
Use case No.3

Кнопка сохранить
Проигрываем 2 квадрата
Загружаем на сервер
Показываем алерт
Use case No.3

recordingPromise =
sampler.recordBars()
.then(parseService.saveSequences)
.then {
self.view.animateRecord(false)
self.view.showAlert(message:…)
}
.error { … }
ViewModel
Use case No.4

Кнопка загрузить
Загружаем случайный бит
Передаем его в семплер
Показываем алерт
Use case No.4

downloadingPromise =
parseService.loadRandomSequences()
.then(sampler.load)
.then {
self.view.animateDownload(false)
self.view.showAlert(message:…)
}
.error { … }
ViewModel
Use case No.4

ParseService
func loadRandomSequences() -> Promise<[BeatSequence]> {
return client
.downloadRandomFile()
.then(parseData)
}
func downloadRandomFile() -> Promise<Data> {
return allPFObjectsFromServer()
.then(downloadRandomFileFromPFObjects)
}
ParseClient
Когда стоит использовать Promises?

• Сложный бекэнд (последовательные/
параллельные запросы)
• Много трудоемких операций в бекграунд потоке
• Последовательная анимация
• Использование promise в качестве
контейнера
Преимущества Promises

• Декларативно - весь код находится рядом
• Хранит результат для переиспользования
• Легко собирать результаты разных операций
• Удобно обрабатывать ошибки
Недостатки Promises

• Неудобно отлаживать
• Не подходит для непрерывного потока данных
• Неочевидная работа с делегатами
https://github.com/
mcrakhman/drumdemo

More Related Content

Viewers also liked

How search engine works
How search engine worksHow search engine works
How search engine worksAshraf Ali
 
Evaluation – question 6
Evaluation – question 6Evaluation – question 6
Evaluation – question 6Saima Bokth
 
Marketing strategy of mobile app
Marketing strategy of mobile appMarketing strategy of mobile app
Marketing strategy of mobile appRitambhara Kumari
 
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...Mail.ru Group
 
Wireless hacking and security
Wireless hacking and securityWireless hacking and security
Wireless hacking and securityAdel Zalok
 
San martin presentacion original (1)
San martin presentacion original (1)San martin presentacion original (1)
San martin presentacion original (1)cotiisaucedo3
 

Viewers also liked (10)

Teclaa
TeclaaTeclaa
Teclaa
 
How search engine works
How search engine worksHow search engine works
How search engine works
 
Dedicated App Developers in NY
Dedicated App Developers in NYDedicated App Developers in NY
Dedicated App Developers in NY
 
Evaluation – question 6
Evaluation – question 6Evaluation – question 6
Evaluation – question 6
 
Google now!
Google now!Google now!
Google now!
 
Marketing strategy of mobile app
Marketing strategy of mobile appMarketing strategy of mobile app
Marketing strategy of mobile app
 
Python Programming Essentials - M39 - Unit Testing
Python Programming Essentials - M39 - Unit TestingPython Programming Essentials - M39 - Unit Testing
Python Programming Essentials - M39 - Unit Testing
 
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...
 
Wireless hacking and security
Wireless hacking and securityWireless hacking and security
Wireless hacking and security
 
San martin presentacion original (1)
San martin presentacion original (1)San martin presentacion original (1)
San martin presentacion original (1)
 

Similar to Михаил Рахманов — Promises, или почему обещания надо выполнять

RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
JavaScript. Асинхронное программирование. Promise & Deferred
JavaScript. Асинхронное программирование. Promise & DeferredJavaScript. Асинхронное программирование. Promise & Deferred
JavaScript. Асинхронное программирование. Promise & Deferreddokhrimenko
 
мартюшев александр - необходимые навыки технического лидера в Agile проектах
мартюшев александр - необходимые навыки технического лидера в Agile проектахмартюшев александр - необходимые навыки технического лидера в Agile проектах
мартюшев александр - необходимые навыки технического лидера в Agile проектахMagneta AI
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiMichael Chernobrov
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл ХарьковCodeFest
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Кирилл Толкачёв
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Fwdays
 
Денис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuilders
Денис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuildersДенис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuilders
Денис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuildersYandex
 

Similar to Михаил Рахманов — Promises, или почему обещания надо выполнять (20)

RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
JavaScript. Асинхронное программирование. Promise & Deferred
JavaScript. Асинхронное программирование. Promise & DeferredJavaScript. Асинхронное программирование. Promise & Deferred
JavaScript. Асинхронное программирование. Promise & Deferred
 
мартюшев александр - необходимые навыки технического лидера в Agile проектах
мартюшев александр - необходимые навыки технического лидера в Agile проектахмартюшев александр - необходимые навыки технического лидера в Agile проектах
мартюшев александр - необходимые навыки технического лидера в Agile проектах
 
Tdd php
Tdd phpTdd php
Tdd php
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
BDD
BDDBDD
BDD
 
DevOPS meetup
DevOPS meetupDevOPS meetup
DevOPS meetup
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"
 
Денис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuilders
Денис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuildersДенис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuilders
Денис Чернилевский: Генерация тестовых данных. Библиотека ObjectBuilders
 

More from CocoaHeads

Дмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPERДмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPERCocoaHeads
 
Александр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыраженияАлександр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыраженияCocoaHeads
 
Николай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслейНиколай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслейCocoaHeads
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутриCocoaHeads
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...CocoaHeads
 
Самвел Меджлумян — S3: API на Swift за пять минут
Самвел Меджлумян —  S3: API на Swift за пять минутСамвел Меджлумян —  S3: API на Swift за пять минут
Самвел Меджлумян — S3: API на Swift за пять минутCocoaHeads
 
Александр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия SwiftАлександр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия SwiftCocoaHeads
 
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовКатерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовCocoaHeads
 
Андрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботомАндрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботомCocoaHeads
 
Александр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущегоАлександр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущегоCocoaHeads
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекCocoaHeads
 
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...CocoaHeads
 
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!CocoaHeads
 
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...CocoaHeads
 
Макс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхМакс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхCocoaHeads
 
Александр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработкиАлександр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработкиCocoaHeads
 
Алина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проектеАлина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проектеCocoaHeads
 

More from CocoaHeads (17)

Дмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPERДмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPER
 
Александр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыраженияАлександр Зимин – Анимация как средство самовыражения
Александр Зимин – Анимация как средство самовыражения
 
Николай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслейНиколай Ашанин – Team Lead. Структурирование мыслей
Николай Ашанин – Team Lead. Структурирование мыслей
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
 
Самвел Меджлумян — S3: API на Swift за пять минут
Самвел Меджлумян —  S3: API на Swift за пять минутСамвел Меджлумян —  S3: API на Swift за пять минут
Самвел Меджлумян — S3: API на Swift за пять минут
 
Александр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия SwiftАлександр Зимин (Alexander Zimin) — Магия Swift
Александр Зимин (Alexander Zimin) — Магия Swift
 
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовКатерина Трофименко — Разработка фич: от флагов до a/b-тестов
Катерина Трофименко — Разработка фич: от флагов до a/b-тестов
 
Андрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботомАндрей Володин — Как подружиться с роботом
Андрей Володин — Как подружиться с роботом
 
Александр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущегоАлександр Зимин — Мобильные интерфейсы будущего
Александр Зимин — Мобильные интерфейсы будущего
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотек
 
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...Вадим Дробинин (Vadim Drobinin) —  Заботимся правильно: CareKit, HealthKit и ...
Вадим Дробинин (Vadim Drobinin) — Заботимся правильно: CareKit, HealthKit и ...
 
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
 
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...
 
Макс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложенияхМакс Грибов — Использование SpriteKit в неигровых приложениях
Макс Грибов — Использование SpriteKit в неигровых приложениях
 
Александр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработкиАлександр Зимин — Оптимизация разработки
Александр Зимин — Оптимизация разработки
 
Алина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проектеАлина Михайлова — Как обойтись без менеджера в своем проекте
Алина Михайлова — Как обойтись без менеджера в своем проекте
 

Михаил Рахманов — Promises, или почему обещания надо выполнять