Лекция 8 CS193P Winter 2017 — Multithreading и Text Field (Многопоточность и текстовые поля)

Судя по названию, основными темами Лекции 8 являются:

  1. Многопоточность,
  2. Текстовые поля,

но очень значительная часть Лекции 8 посвящена также усовершенствованию функциональных возможностей демонстрационного приложения Cassini по следующим направлениям :

  • использование множественного MVC Split View Controller в сочетании с парой Navigation Controllers для обеспечения функционирования на iPhone и iPad
  • применение extension для расширения возможностей класса UIViewController
  • тонкости использования индикатора активности  (Activity Indicator) в виде маленького вращающегося «колесика» для визуализации занятости системы
  • использование делегата UISplitViewController для управления появлением Detail или Master

В результате получился универсальный, подходящий на все случаи жизни, как в дальнейшем покажет практика, MVC для показа изображений по их URL —  ImageViewController. Огромный объем изображений NASA, задействованных в демонстрационном приложении Cassini , наглядно показывает необходимость использования многопоточности.

Многопоточность

Это одна из фундаментальных тем для программирования на мобильных устройствах. Но на Лекции 8 рассматривается лишь та часть многопоточности, которая решает проблему поддержания UI в отзывчивом и активном состоянии, выталкивая все, что может быть медленным или блокирующим вследствие ожидания ресурсов, в другой поток, отличный от main queue (главной очереди).  Последовательная очередь main queueDispatchQueue.main, предназначена для взаимодействия с пользователем и должна всегда оставаться свободной. Кроме того, она защищает UI от “разлаживания” в многопоточной среде, поэтому все действия с элементам UI должны выполняться в main queue последовательно в строгом порядке.

В качестве других очередей, куда можно «сбрасывать» ресурсо-емкие операции, в Лекции 8 рассматриваются глобальные параллельные (concurrent) очереди DispatchQueue.global (qos:  QoS) . Показано, как просто выполнять переключения между этими очередями с помощью Grand Central Dispatch, public API которого сильно упростилось в Swift 3. По существу, профессору понадобился всего один оператор async. Но при всей простоте кода, методы многопоточного программирования требуют более изощренного воображения и более широкого взгляда на действия, происходящие в приложении. Дело в том, что в многопоточном программировании отдельные куски кода (чаще замыкания) в разных потоках выполняются не в том порядке, как это написано в коде. Как с этим справиться показано на примере приложения Cassini.

UITextField

Отметим, что UITextField — это не основной источник ввода информации на мобильных устройствах. Но есть случаи, когда без этого не обойтись.

Без делегирования текстовые поля не работают. Поэтому Полу Хэгерти представился еще один случай подробно поговорить о делегировании.

Использование текстового поля тесно связано с появлением и скрытием клавиатуры, а также с тем, что клавиатура может «заслонить» текстовое поле и не позволить вводить текст. Этому вопросу уделяется большое внимание. Рассматриваются различные способы его решения , начиная от привлечения делегата UITextField и кончая использованием специальных  уведомлений UIKeyboard{Will,Did}{Show,Hide}Notifications

Лекции и слайды на английском языке представлены в iTunes название “8. Multithreading and Text Field.”. Код демонстрационного примера «L8 Cassini» доступен как на  iTunes название “Lecture 8 Demo Code: Cassini«, так и на Github.

Русскоязычный неавторизованный конспект Лекции 8, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также Google Doc доступны на платной основе.