SlideShare a Scribd company logo
Введение в паттерн
SchedulableObject
ПАВЕЛ ОСИПОВ
РУКОВОДИТЕЛЬ ГРУППЫ РАЗРАБОТКИ ОБЛАКА MAIL.RU ДЛЯ iOS
Постановка задачи
60FPS = 16,7ms/frame
Как добиться 60 FPS
Арифметика одного фрейма
16,7 - 10 = 6,7
Бизнес-логика отправки файла в Облако
Можем добавить без «лагов»
6,7ms / 2,6 ms = 3
Создание
объекта
BLOB
Добаление
в очередь
задачи
Обновление
локального
кэша
Отправка
сетевых
запросов
2,6 ms
Отправка больше 3 файлов за раз
Решение проблемы массового добавления
файлов в Облако методом позорных констант
Деградация архитектуры: исходное состояние
Деградация архитектуры: явление проблемы
Деградация архитектуры: неправильное
решение проблемы «бутылочного горлышка»
Деградация архитектуры: шаг 1
Деградация архитектуры: шаг 2
Деградация архитектуры: шаг N
Thread-Safe Architecture
Решение (не для iOS): Multiprocess Architecture
Решение для iOS: Schedulable Architecture
Принцип действия паттерна
SchedulableObject
1. События
2. Очередь событий
3. Цикл обработки
сообщений
4. Планировщик
5. SchedulableObject
Основные компоненты паттерна
Компоненты паттерна: Event
Компоненты паттерна: Event Queue
Компоненты паттерна: RunLoop
1.NSThread
2.NSOperation
3.Grand Central Dispatch
Компоненты паттерна: Thread
Компоненты паттерна: Scheduler
Компоненты паттерна: SchedulableObject
Соединяем все вместе: Сервисы
Соединяем все вместе: Assembly
Соединяем все вместе: Application
Библиотека
POSSchedulableObject
POSSchedulableObject: реализация компонент
Компонент Реализация
Event Блоки Objective-C
Event Queue Внутренняя реализация dispatch_queue_t из GCD
Run Loop Внутренняя реализация dispatch_queue_t из GCD
Thread Внутренняя реализация dispatch_queue_t из GCD
Scheduler RACTargetQueueScheduler из ReactiveCocoa
SchedulableObject Базовый класс для управляемых объектов
POSSchedulable
Объявление класса
Взаимодействие с классом
Сборка объектов: простой случай
Сборка объектов: сложный случай
Сборка объектов: решение сложного случая
Сборка объектов: пример сложного случая
1. Библиотека POSSchedulableObject - http://bit.ly/schedulable_object
2. Консольное демо-приложение - http://bit.ly/schedulable_object_concept
3. Большое демо-приложение для iOS - http://bit.ly/schedulable_object_demo
4. Ссылка на презентацию - http://bit.ly/schedulable_object_pptx
Ссылки
Контакты
Email: posipov@bk.ru
Twitter: @posipov

More Related Content

PDF
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
PDF
Настройка Kubernetes: tips ans tricks
PDF
Петр Леменков - Как облачные технологии меняют Linux-дистрибутивы
PDF
Роман Еникеев - PHP обязан умирать
PDF
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
PPT
архитектура новой почты рамблера
PDF
Android Telegram S Optimizations
PDF
Управление контейнерами в облаках
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Настройка Kubernetes: tips ans tricks
Петр Леменков - Как облачные технологии меняют Linux-дистрибутивы
Роман Еникеев - PHP обязан умирать
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
архитектура новой почты рамблера
Android Telegram S Optimizations
Управление контейнерами в облаках

What's hot (19)

PDF
RootConf 2015
PDF
openSUSE Build Server от Б до Ю
PDF
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
PDF
Moscow DevOps meetup 18.05.13
PDF
«​Масштабируемый DevOps​» Александр Колесень
PDF
Выступление Юрия Насретдинова, Badoo, на High Performance Conference
PDF
Badoo presentation-2012-rit-nasretdinov
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PDF
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
ODP
Highload Begun Pankov
PDF
Роман Иманкулов-«Быстрые и масштабируемые приложения с Sync API»
PDF
Л9: Взаимодействие веб-приложений
PDF
Containers in real world презентация
PDF
Apache Kafka and stream processing peculiarities [ru]
PDF
CodeFest 2013. Чистяков А. — Использование систем виртуализации в веб
PPTX
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
PDF
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
PPTX
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
PDF
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
RootConf 2015
openSUSE Build Server от Б до Ю
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Moscow DevOps meetup 18.05.13
«​Масштабируемый DevOps​» Александр Колесень
Выступление Юрия Насретдинова, Badoo, на High Performance Conference
Badoo presentation-2012-rit-nasretdinov
Современная операционная система: что надо знать разработчику / Александр Кри...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Highload Begun Pankov
Роман Иманкулов-«Быстрые и масштабируемые приложения с Sync API»
Л9: Взаимодействие веб-приложений
Containers in real world презентация
Apache Kafka and stream processing peculiarities [ru]
CodeFest 2013. Чистяков А. — Использование систем виртуализации в веб
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Ad

Viewers also liked (20)

PDF
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...
PDF
iMessage Apps: от стикеров до банковских приложений за 30 минут, Вадим Дробин...
PDF
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...
PDF
«Управление логикой переходов между экранами приложения с помощью координатор...
PDF
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
PDF
«Как общаться и договариваться с заказчиками о проектной работе», Валентин Ша...
PPTX
Кортунов Никита. Как ускорить разработку приложений или есть ли жизнь после P...
PDF
«Пиринговый веб на JavaScript», Денис Глазков
PDF
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...
PDF
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
PDF
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...
PDF
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group
PDF
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
PDF
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
PDF
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)
PPTX
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)
PDF
Profiling and optimizing go programs
PDF
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...
PDF
Парсим CSS
PDF
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...
iMessage Apps: от стикеров до банковских приложений за 30 минут, Вадим Дробин...
Альтернативная монетизация — краудфандинг, Каменев Игорь, основатель проекта ...
«Управление логикой переходов между экранами приложения с помощью координатор...
«MVVM в Swift», Александр Зимин, независимый iOS-разработчик
«Как общаться и договариваться с заказчиками о проектной работе», Валентин Ша...
Кортунов Никита. Как ускорить разработку приложений или есть ли жизнь после P...
«Пиринговый веб на JavaScript», Денис Глазков
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)
Profiling and optimizing go programs
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...
Парсим CSS
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...
Ad

Similar to Введение в паттерн Schedulable object, Павел Осипов, руководитель разработки iOS-приложений Облака Mail.Ru, преподаватель Технопарка Mail.Ru (20)

PPTX
Внедрение параллельного рендеринга в игровой движок
PPT
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
PDF
Разработка мобильных приложений под iOS
PDF
Android: Как написать приложение, которое не тормозит
PDF
Практическое применение HTML5 в Я.Почте
PDF
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
PPT
архитектурные приемы онлайн игры
PPT
kudinov
PDF
Денис Колошко, Пример нагруженной системы на базе продуктов Microsoft, Amazon...
PDF
Бэкенд, фронтенд — всё смешалось (nodkz)
PDF
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
PPTX
MongoDB первые впечатления
PDF
Истинный DevOps. Секрет 42.
PDF
Доставка данных в реальном времени.
PPT
Lobanov_Cloud-Comput..
PPTX
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
PPT
Быстрое масштабирование систем
PDF
Дмитрий Еманов — Под капотом серверного ПО
PPTX
Знакомство с WebAssembly
PDF
IT-инфраструктура. FAQ для разработчика
Внедрение параллельного рендеринга в игровой движок
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Разработка мобильных приложений под iOS
Android: Как написать приложение, которое не тормозит
Практическое применение HTML5 в Я.Почте
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
архитектурные приемы онлайн игры
kudinov
Денис Колошко, Пример нагруженной системы на базе продуктов Microsoft, Amazon...
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
MongoDB первые впечатления
Истинный DevOps. Секрет 42.
Доставка данных в реальном времени.
Lobanov_Cloud-Comput..
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
Быстрое масштабирование систем
Дмитрий Еманов — Под капотом серверного ПО
Знакомство с WebAssembly
IT-инфраструктура. FAQ для разработчика

More from Mail.ru Group (20)

PDF
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
PDF
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
PDF
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
PDF
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
PDF
Управление инцидентами в Почте Mail.ru, Антон Викторов
PDF
DAST в CI/CD, Ольга Свиридова
PDF
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
PDF
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
PDF
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
PDF
WebAuthn в реальной жизни, Анатолий Остапенко
PDF
AMP для электронной почты, Сергей Пешков
PDF
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
PDF
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
PDF
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
PDF
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
PDF
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
PDF
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
PDF
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
PDF
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
PDF
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Управление инцидентами в Почте Mail.ru, Антон Викторов
DAST в CI/CD, Ольга Свиридова
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
WebAuthn в реальной жизни, Анатолий Остапенко
AMP для электронной почты, Сергей Пешков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()

Введение в паттерн Schedulable object, Павел Осипов, руководитель разработки iOS-приложений Облака Mail.Ru, преподаватель Технопарка Mail.Ru

Editor's Notes

  • #2: Паттерн SchedulableObject позволяет назначить объекту поток, в контексте которого должны осуществляться вызовы всех его методов. Согласованное назначение одного и того же потока нескольким объектам позволяет радикально упросить архитектуру приложения, превращая  ее из многопоточной в 2-х или, в общем случае, N-поточную.
  • #3: В данном разделе будет рассмотрен симптом высоконагруженной бизнес-логики, появление которого говорит о целесообразности использования паттерна SchedulableObject
  • #4: Принято считать, что пользователь воспринимает интерфейс приложения плавным, если он в состоянии обновляться 60 раз в секунду. На эту цифру можно посмотреть в ином разрезе. Поделив 1000 мс на 60 фреймов мы получим, что в случае плавного интерфейса каждый фрейм должен успеть выполниться не более чем за 16,7 мс.
  • #5: Допустим пользователь в определенный момент времени наблюдает некое окно, лайаут которого успевает отрисоваться за 10 мс. Это значит, что на бизнес-логика в рамках одного фрейма может потратить не более 6,7 мс.
  • #6: Рассмотрим в качестве примера бизнес-логику добавления файла в Облако. Она состоит из множества этапов, суть которых в контексте данного доклада нас не интересует. Важно то, что все они вместе занимают 2,6 мс. Поделив максимальное время, отведенное на работу бизнес-логики, на время добавления одного файла, мы получим число 3. Оно означает, что если приложение хочет сохраняться отзывчивым при отработке данного кейса, оно не может позволить себе добавлять более 3 файлов единовременно.
  • #7: С счастью для пользователя, но к сожалению для разработчиков, в приложении Облако существуют кейсы, когда необходимо добавить более 3 файлов за раз.
  • #8: В данный момент, во избежание длительного «подвисания» приложения скорость добавления файлов в очередь на загрузку сервисом автозагрузки искусственно ограничивается методом «позорных констант». Две такие константы представленны на слайде. Их семантика такова: по итогам сканирования галереи на предмет новых фото, сервис должен добавлять их в очередь загрузки пачками не более 1000 штук каждая с интервалом 5 секунд. Но даже при таком ограничении мы имеем подвисание на 1000 * 2,6мс = 2,6 сек. каждые 5 сек., что не может не огорчать. Искусственное ограничение пропускной способности бизнес-логики – признак ее высконагруженности. Паттерн SchedulableObject призван побороться с данным неприятным явлением.
  • #9: Рассмотрим альтернативу методу «позорных констант». Для этого проследим эволюцию архитектуры классического бизнес-приложения. В рамках рассмотрения особый интерес представляют потоки (threads), в контексте которых происходит вызов методов объектов. Каждый из них мы будем кодировать своим собственным цветом. Изначально все происходит в главном потоке, поэтому все связи и сущности имеют одинаковый синий цвет.
  • #10: Допустим, появился сценарий, при отработке которого один из объектов стал потреблять слишком много времени (более 6,7 мс). Из-за этого отзывчивость пользовательского интерфейса начинает страдать. Обозначим проблемный поток данных (data flow) жирными стрелками.
  • #11: Без проведения рефакторинга ресурсоемкого класса осуществлять вызовы к нему в отельном красном потоке нельзя. Причина в том, что у него не один клиент, а два, и второй по-прежнему осуществляет вызовы из главного синего потока. Если эти вызовы изменяют разделяемое состояние объекта, то произойдет классическая проблема гонки к данным.
  • #12: Для защиты от «гонки данных» необходимо реализовывать красный объект с предыдущего слайда потокобезопасным образом.
  • #13: По мере развития проекта, еще один компонент становится узком местом. К счастью, у него только один клиент и потокобезопасная реализация не потребовалась.
  • #14: Экстраполируя указанный подход к проектированию многопоточной архитектуры, рано или поздно она приходит к состоянию, изображенном на слайде.
  • #15: При увеличении связей между объектами состояние архитектуры становится совсем плачевным. Недостатки данного подхода с условным названием Thread-Safe Architecture таковы: Необходимость в постоянном отслеживании связей между объектами для своевременного проведения рефакторинга однопоточной реализации метода/класса на потокобезопасную (и обратно). Потокобезопасные методы сложны в реализации, поскольку помимо прикладной логики необходимо учитывать специфику многопоточного программирования. Активное использование примитивов синхронизации может в итоге сделать приложение еще более медленным, чем его однопоточная версия.
  • #16: В мире серверной, десктопной и даже Android-разработки тяжелую бизнес-логику часто выделяют в отдельный процесс. Взаимодействие между сервисами внутри каждого из процессов продолжает носить однопоточных характер. Сервисы из разных процессов взаимодействуют друг с другом с использованием тех или иных механизмов межпроцессного взаимодействия (DCOM, Corba, .Net Remoting Boost.Interprocess и т.п.). К сожалению в мире iOS разработки мы ограничены лишь одним процессом и AS IS такая архитектура не подходит. Однако…
  • #17: Мы можем адаптировать многопроцессную архитектуру на iOS-ный лад. Для этого мы заменяем процессы – потоками, а механизмы межпроцессного взаимодействия – косвенными вызовами. Выражаясь более формальным языком, суть трансформации такова: Завести один отдельный рабочий поток. Проассоциировать с ним цикл обработки событий и специальный объект для доставки в него сообщений – планировщик (от англ. scheduler). Связать каждый изменяемый объект с одним из планировщиков. Чем больше объектов будет связано с планировщиками рабочих потоков, тем больше времени останется у главного потока на свою основную обязанность – обновление пользовательского интерфейса. Выбирать правильный способ взаимодействия объектов друг с другом в зависимости от их принадлежности к планировщикам. Если планировщик общий, то взаимодействие осуществляется путем прямого вызова методов, если же нет, то опосредованно, через отправку событий. Полученную архитектуру я и называю Schedulable Architecture.
  • #19: В основе паттерна Schedulable Architecture лежат пять компонент. Далее для каждого из них определяется зона ответственности и предлагается наивная реализация с целью наиболее наглядным образом проиллюстрировать его внутреннее устройство.
  • #20: Наиболее удобной абстракцией для событий в iOS являются блоки, внутри которых происходит вызов нужного метода объекта.
  • #21: Поскольку события в очередь поступают из разных потоков, то очередь требует потокобезопасной реализации. Фактически именно она избавляет нас от трудностей многопоточной разработки в прикладных компонентах.
  • #22: RunLoop реализует строго последовательную обработку событий из очереди. Именно благодаря этому свойству компонента паттерн SchedulableObject гарантирует, что все вызовы к реализующим его объектам осуществляются строго в одном потоке. В iOS SDK имеется стандартная реализация данного компонента – NSRunLoop.
  • #23: Объект ядра операционной системы, в котором происходит исполнение кода цикла обработки сообщений. Наиболее низкоуровневой реализацией в iOS SDK является класс NSThread. Для практических целей рекомендуются к использованию более высокоуровневые примитивы вроде NSOperationQueue или очереди из Grand Central Dispatch.
  • #24: Обеспечивает механизм доставки событий до требуемой очереди. Будучи главным компонентом, посредством которого клиентский код исполняет методы объектов, его он дает название как микропаттерну SchedulableObject, так и макропаттерну Schedulable Architecture.
  • #25: Обеспечивает вызов методов объекта в строго определенном потоке. По отношению к целевому объекту может выступать как в роли агрегата, как в примере ниже, так и в роли базового класса, как в библиотеке POSSchedulableObject.
  • #26: Продемонстрируем взаимодействие всех компонент архитектуры на примере консольного приложения. Его полный листинг доступен по ссылке – http://bit.ly/schedulable_object_concept. Приложение дублирует на консоли вводимые пользователем строки. Слой бизнес-логики, который мы хотим вынести из главного потока, представлен двумя классами: Printer печатает подаваемые ему строки в консоль. PrintOptionsProvider позволяет конфигурировать сервис Printer.
  • #27: Assembly реализует паттерн Dependency Injection Container. Объекта данного класса создает сервисы бизнес-логики. Обратите внимание, что сервис PrintOptionsProvider инжектируется в сервис Printer AS IS, а снаружи оба сервиса доступны как SchedulableObject. Причина в том, что оба сервиса живую в одном и том же потоке и поэтому могут взаимодействовать друг с другом напрямую. Извне (в слое представления) они в видны под видом управляемых объектов, взаимодействие с которыми возможно только косвенным образом через отправку событий.
  • #28: Слайд демонстрирует, как выглядит косвенное взаимодействие.
  • #29: POSSchedulableObject – пример реализации паттерна на Objective-C. Библиотека доступна по ссылке – http://bit.ly/schedulable_object
  • #30: В библиотеке реализован базовый класс, который: Имеет ссылку на планировщик, через который должно происходить косвенное взаимодействие с объектом. Автоматически проверяет корректность потока, из которого происходит вызов методов объекта-наследника. Достигается это за счет навешивания хуков (hooks) на все его методы в момент инициализации. В виду дороговизны данной процедуры по умолчанию она осуществляется только в отладочной версии приложения.  Основную часть исходников репозитория составляет демо-приложение. Оно авторизует пользователя в сервисе Dropbox, после чего выводит на экран имя и фамилию из его профиля. Рассмотрим несколько образцово-показательных примеров использования им библиотеки POSSchedulableObject.
  • #31: Протокол POSSchedulable содержит методы для отправки событий реализующему его объекту. Их использование было продемонстрировано в примере выше. Класс POSSchedulableObject полностью реализует одноименный протокол. Кроме того, он добавляет проверки на предмет того, что методы объекта вызываются в правильном потоке. Из проверок исключаются свойства с атрибутом atomic. Для ручного исключения тех или иных методов существует специальный инициализатор с настройками исключений.
  • #32: Пример объявления класса для управляемых объектов.
  • #33: В консольном приложении, представленном в статье, коммуникация с объектом класса Printer была односторонней. Листинг на слайде показывает, как получить результат косвенного вызова и воспользоваться им в контексте потока вызвавшего его объекта.
  • #34: Все объекты бизнес-логики приложения создаются внутри специальных классов, реализующих паттерн Dependency Injection Container. По аналогии с популярной библиотекой Typhoon, в названиях таких классов фигурирует корень Assembly. Создание объектов внутри них имеет две особенности: Объекты создаются лениво, по запросу. Следствием этого является изменяющееся на протяжении времени жизни состояние объектов Assembly. Оно также защищается от многопоточного доступа путем наследования от POSSchedulableObject. Возврат объектов попросившей их стороне происходит синхронно во избежании большого количества клиентского boilerplate-кода. Как видно из предыдущего листинга кода, использование accountInfoProvider достаточно многословно. Несложно представить, как приведенный код мог бы еще больше усложниться, если бы интерфейс Assembly имел асинхронную природу. Таким образом, Assembly обязуется создать и вернуть любой сервис синхронно и только в главном потоке.
  • #35: Все выглядит достаточно просто пока вдруг не потребуется создать граф объектов, которые , во-первых, живут в разных потоках, а во-вторых, для своей инициализации требуют вызвать один или несколько своих методов. Проблема в этом сценарии состоит в том, что для инициализации объекта A необходимо в красном потоке инициализировать объект B. Для того, чтобы с точки зрения клиента Assembly это произошло синхронно, на время создания красного объекта B синий поток должен быть заблокирован. Однако объекту B нужен объект C. Последний может создаться только в синем потоке. По аналогии с предыдущим шагом, на время его создания красный поток блокируется и ожидает завершения создания объекта C. Ожидание на этом этапе будет длиться вечно, поскольку событие, отправленное в синий поток, никогда не будет обработано, поскольку он был заблокирован при создании объекта A.
  • #36: Выход из сложившейся ситуации заключается в том, чтобы блокировать поток с помощью специальной spin-блокировки. Она должна останавливать исполнение текущего потока, но при этом осуществлять прокручивание его цикла обработки сообщений. В рамках библиотеки POSSchedulableObject специально для этого случая предусмотрен метод posrx_await в категории к RACSignal.