Чем больше знаний и опыта у разработчика приложений для iOS, тем лучше, однако новичков интересует программа-минимум. В подготовленной совместно с факультетом iOS-разработки GeekBrains статье мы рассмотрим только необходимые для входа в профессию позиции. Например, суметь построить проект для портфолио, решить задачу на хакатоне или пройти собеседование.
1) Язык Swift
Изучить язык поможет книга Василия Усова “Основы разработки приложений под iOS, iPadOS и macOS” или абсолютный ее аналог – русскоязычный сайт Swiftbook. В разделе “Учебник” есть вся необходимая документация – это перевод руководства по Swift на английском языке. На официальном сайте Swift можно также найти методические рекомендации.
Чтобы усвоить материал, воспользуйтесь бесплатными видеоуроками на YouTube (одного руководства будет недостаточно). Необходимо применять теорию на практике с первых дней обучения, и в этом вам помогут русскоязычные youtube-каналы The Swift Developers, Alex Skutarenko, Школа iOS-разработчиков. Стоит также открыть англоязычные туториалы Lets Build That App и Sean Allen или посмотреть курс Стэнфорда. В комментариях вы сами можете поделиться понравившимися каналами.
2) Lifecycle View Controller
Жизненный цикл View Controller – это начинающаяся с создания последовательность шагов. Приходит создание View Controller со storyboard (выставляем view, button) или из кода. Начинается цикл с момента, когда приложение запускается, и на экране появляется первый View Controller. Вторым шагом является инициализация. Нужен View Controller, чтобы все объекты были установлены. Подготовить его к появлению и, вероятно, исчезновению, на экране помогают методы инициализации.
Методы инициализации View Controller:
- ViewDidLoad
Этот метод устанавливает outlets и prepare, и подходит для первоначальной установки MVC. Можно обновить View в соответствии с Model. Метод вызывается только один раз за все время существования View Controller. Исключения: нельзя помещать зависящие от размера экрана объекты во View Controller с этим методом инициализации. Не будет работать на других устройствах, так как не приспособлен к ним.
- ViewWillAppear
Метод обновляет View каждый раз, когда мы заходим во View Controller. Он позволяет узнать, что изменилось во View, когда мы были вне его. Метод отправляется каждый раз перед появлением MVC на экране, независимо от того, сколько раз он уже появился до этого. Улавливает состояние Model в тот момент, когда мы находились вне View и вошли в него. Подходит для случая, если Model – это сетевая база данных.
- ViewDidAppear
Метод вызывается в момент, когда View уже появился на экране. Подходит для анимации, запуска таймера, наблюдения GPS, gyro-position. Вызывается только один раз и только когда мы уже на экране. Также можно применять для подгрузки тяжелых объектов, например, данных из сети. Мы используем именно этот метод для подгрузки данных, потому что он позволяет не блокировать экран от пользователя во время выполнения загрузки. Мы не применяем этот метод, если хотим обновить View в соответствии с Model, так как метод вызывается после вывода View на экран.
- ViewWillDisappear
Метод вызывается перед уходом MVC c экрана. Используется, чтобы отменить сделанное во ViewDidAppear. Например, остановить выполнение таймера, прервать анимацию, прекратить наблюдение GPS. ViewDidAppear и ViewWillDisappear могут работать вместе. Когда MVC вновь появится на экране, сработает ViewDidAppear
- ViewDidDisappear
Метод вызывается после того, как MVC полностью вышел с экрана. Применяется редко.
Для объектов, которые зависят от размера экрана (исключение для ViewDidLoad) используются 2 метода:
- override func ViewWillLayoutSubviews()
- override func ViewDidLayoutSubviews()
3) Архитектурные паттерны
В iOS существуют 4 основных способа организации кода, которые предполагают выделение отвечающих за решение разных задач блоков.
- MVC (model-view-controller)
Model – блок кода, который отвечает за данные.
View – лицо приложения. View предназначен для взаимодействия с пользователем и определения внешнего вида. Все, что начинается с префикса UI, относится к этому блоку.
Controller – связующее звено между View и Model. Он реагирует на действия пользователя и передает изменения в Model. И, наоборот, когда в Model происходят изменения, изменяются данные, он передает через Controller изменения во View, чтобы эти изменения отобразились на экране у пользователя.
- MVP (Model-View-Presenter)
Presenter – посредник между View и Model. Он реагирует на выполняемые во View действия пользователя, извлекает данные из Model и форматирует их для отображения во View.
View – UIView + UIViewController. Получает UI-события от пользователя.
Model – блок кода, который отвечает за данные.
Преимущества перед MVC: код лучше разделен, проводить тесты удобнее.
Недостатки по сравнению с MVC: написание кода занимает больше времени, количество кода больше.
- MVVM (Model-View-ViewModel)
Model – данные приложения.
View – Элементы пользовательского интерфейса (UI). ViewController + View.
ViewModel – Обновляет Model в соответствии с View. Обновляет View в соответствии с данными в Model.
- VIPER (View–Interactor–Presenter–Entity–Router)
View – Слой подразумевает файлы UIKit(включая UIViewController). Отображает, что сообщил Presenter и передает введенные пользователем данные назад Presenter'у.
Interactor – Содержит логику, необходимую для работы приложения. Interactor отвечает за получение данных (сетевые или локальные запросы). Он решает, что делать дальше с поступившими событиями и какой сервис вызвать. Не связан с интерфейсом пользователя.
Presenter – Подготавливает и передает визуальные данные для View/ViewController, которые будут видны пользователю. Presenter получает данные из Interactor и передает его во View. Он реагирует на ввод пользователем данных, запрашивает дополнительные данные из базы, либо, наоборот, передает их ей. Presenter решает, куда перенаправить действие – на Router или Interactor.
Entity – простые объекты данных без логики, которыми управляет Interactor.
Router – Вся навигационная логика приложения. Router будет либо закрывать текущий экран, либо открывать новый. Конкретная реализация перехода осуществляется в нем.
4) Многопоточность
Многопоточность – способ проектирования приложения, при котором блоки кода разделены и выполняются одновременно. Каждый несет ответственность за свою задачу: вычисления, загрузку данных из сети, обработку изображений и т.д.
Зачем нужна многопоточность? Любое приложение работает на main thread – главный поток. Main thread выполняет код, который отвечает за пользовательский интерфейс. Если добавить в главный поток блок кода, который подгружает данные из сети, отображение пользовательского интерфейса будет работать медленно или вовсе заблокируется. Причина: ядро процессора не может справиться с такой нагрузкой. Чтобы этого не произошло, нужно разделять задачи на потоки.
Для процессора с одним ядром многопоточность достигается многократными кратковременными переключениями между потоками, на которых выполняются задачи. В многоядерном процессоре каждому потоку предоставляется свое собственное ядро.
Цель многопоточности – увеличение производительности и отзывчивости пользовательского интерфейса.
Инструменты для многопоточности: Thread, Grand Central Dispatch и Operation.
Применяются на практике последние 2, так как они более высокого уровня.
Сравнение Grand Central Dispatch и Operation поможет решить, какой выбрать:
- GCD – более простая реализация. Зависимости между блоками не создаются. Управлять блоками кода и планировать их нельзя. GCD вызывает потоки автоматически. Его используют для простых случаев, когда необходимо перенести блоки кода из главного потока.
- Operation – более высокий уровень по сравнению с GCD. Есть возможность добавить зависимости, повторно использовать, отменить или приостановить. Состояние Operation можно контролировать. Можно указать максимальное количество операций в очереди, которые будут выполняться одновременно. Если нужно полностью контролировать процесс многопоточности, то используется Operation.
5) Grand Central Dispatch
Grand Central Dispatch (GCD) – это API для управления параллельными операциями. Оптимизирует приложение, откладывая времязатратные процессы в фоновый режим (non-main queue). С этой моделью многопоточности работать проще, чем с threads и Operation.
В очередях (queues) выстраиваются замыкания. GCD выполняет их, следуя FIFO паттерну (First In, First Out). Это означает, что замыкание, которое было поставлено в очередь первым, будет первым направлено на выполнение в собственном потоке.
Очередь бывает последовательная и параллельная.
Последовательные очереди гарантируют, что в любой момент времени выполняется только одна задача. Параллельные позволяют запускать несколько задач одновременно.
Когда начинать задачу в параллельной очереди, решает GCD. Если время выполнения перекрывается, GCD должен определить, должна ли задача работать на другом ядре, если оно доступно, или выполнить переключение для запуска другой.
GCD предоставляет три основных типа очередей:
1) Main queue – выполняется в основном потоке и представляет собой последовательную очередь. Отвечающий за пользовательский интерфейс код выполняется в main queue и только в ней. Наоборот, не отвечающий за UI тяжелый и времязатратный код, не выполняется в этой очереди. Такое распределение необходимо, чтобы UI был всегда отзывчивым.
Создание main queue:
2) Global queues – параллельные общие очереди, используемые для кода вне main queue.
3) Custom queues – очереди, создаваемые программистом. Могут быть последовательными или параллельными.
При отправке задач в глобальные параллельные очереди нужно указать качество обслуживания (QoS – quality of service ), чтобы не указывать приоритет напрямую. QoS определяет важность задачи.
Классы QoS:
- DispatchQoS.userInteractive – высокий приоритет. Задачи, которые необходимо выполнить немедленно, чтобы обеспечить удобство работы пользователя. Общий объем кода должен быть небольшим, без временных задержек.
- DispatchQoS.userInitiated – высокий приоритет. Может занять немного времени. Для взаимодействующих с пользователем задач, от которых юзер ожидает немедленных результатов.
- DispatchQoS.background – приоритет “на фоне”. Представляет собой задачи, о которых пользователь не знает напрямую. Может работать медленно настолько, насколько это необходимо. Для задач, которые не требуют взаимодействия с пользователем и не зависят от времени.
- DispatchQoS.utility – низкий приоритет. Длительный фоновый процесс. Зачастую задачи с видимым для пользователя индикатором выполнения. Нужен для вычислений, ввода-вывода, работы в сети, непрерывной передачи данных и т.д. Класс разработан для обеспечения энергоэффективности.
Естественно, при изучении этих навыков нужно тренировать все знания. Вам пригодится изучение дополнительных тем:
- Autolayout, interface builder;
- UItableView;
- URLSession, JSON;
- User Defaults, Core Data, SQLite, Keychain;
- Утечки памяти, способы их устранения, ARC;
- Drawing, core graphics;
- Gestures (swipe,pan,tap);
- Animation;
- Работа с Github;
- Xcode Instruments;
- Alerts,Notification, application lifecycle.
Хочу научиться программировать с нуля, но не знаю, с чего начать. Что делать?
Можно учиться самостоятельно (долго) или пойти на курсы с преподавателями (быстро). Плюс нужно учитывать, что джунов много, конкуренция выше и работодатели повышают порог вхождения при найме на работу. Чтобы получить актуальные знания, мы в proglib.academy запустили курсы:
- Основы программирования на Python.
- Профессия Python-разработчик.
- Алгоритмы и структуры данных.
- Математика для Data Science.
- Профессия Data Science.
- Frontend Basic: принцип работы современного веба.
- Профессия Фронтенд-разработчик.
- Обработка естественного языка. Полный курс.
На подходе еще больше 10 курсов для взрослых и детей.
Комментарии