жизненный цикл приложения swift ios

PreWorking 4: Жизненный цикл iOS приложения

Понимание того, как устроено и работает приложение очень важно для более осмысленного программирования. Сегодня мы рассмотрим тему «жизненный цикл iOS приложения».

Приложения представляют очень сложное взаимодействие между вашим кодом и системными фреймворками. Системный фреймворки предоставляют базовую инфраструктуру, с которой все приложения должны работать, а вы пишете код для настройки этой инфраструктуры.

Фреймворки iOS основаны на таких шаблонах проектирования, как MVC и делегирование (Мы писали об этом ранее). Понимание этих шаблонов имеет решающее значение для создания приложения.

Жизненный цикл iOS приложения: Функция main

Точкой входя для каждого C-приложения является функция main. iOS приложения не стали исключением. Вот только вам не нужно писать эту функцию самостоятельно. Вместо этого, Xcode создаст ее как часть вашего основного проекта. Ниже вы можете увидеть эту функцию для Objective-C. За редкими исключениями, вы никогда не должны ее изменять.

Жизненный цикл iOS приложения: Структура приложения

Во время запуска UIApplicationMain функция устанавливается несколько ключевых объектов и запускает приложение. Сердцем каждого iOS приложения является объект UIApplication, задача которого — облегчить взаимодействие между системой и другими объектами приложения. Рисунок ниже показывает объекты, обычно встречающиеся в iOS приложениях. А еще ниже представлено описание роли каждого объекта в приложении. Первое что стоит отметить — iOS приложения используют архитектуру Model-View-Controller. Эта архитектура имеет решающее значение для создания приложений, которые могут работать на различных устройствах с различными размерами экрана.

жизненный цикл приложения swift ios

Жизненный цикл iOS приложения: Главный цикл

Приложение в главном цикле обрабатывает все пользовательские события. Главный цикл работает в главном потоке приложения. На изображении ниже показана схема работы главного цикла.

жизненный цикл приложения swift ios

Жизненный цикл iOS приложения: Состояние приложения

В любой момент времени ваши приложение находятся в каком либо из перечисленных ниже состояний. Система меняет состояния вашего приложения в ответ на происходящие события. Например, когда пользователь нажимает кнопку Home, или поступает входящий вызов, или что либо еще — приложения в ответ на все это меняют свое состояние.

Not RunningПриложение не запущено, либо запущенно но прервано системой.
InactiveПриложение работает, но в настоящий момент ничего не делает (это может быть связано с выполнением другого кода). Приложение, как правило, остается в этом состоянии очень мало времени и переходит в другое состояние
ActiveНормальный обычный режим работы приложения на переднем плане.
BackgroundПриложение находится в фоне, но работает. Большинство приложений входят в это состояние на короткое время и позже приостанавливаются. Но если необходимо дополнительное время для работы в бекграунде, приложение может оставаться в этом состоянии
SuspendedПриложение работает в фоне, но не выполняет никакой код. Система перемещает приложение в это состояние автоматически и не предупреждает об этом. При условии малого количества памяти, система может не предупреждая закрыть приложения в этом состоянии для освобождения памяти.

жизненный цикл приложения swift ios

Большинство переходов между состояниями обеспечивается соответствующими методами в AppDelegate.

Жизненный цикл iOS приложения: Завершение приложения

Suspended приложения не получают уведомления о завершении. Система убивает процесс и восстанавливает соотвествующую память. Если приложение запущено в фоне и не отвечает, система вызовет applicationWillTerminate: чтобы приложение подготовилось к выключаению. Система не вызывает метод когда устройство перезагружается.

Жизненный цикл iOS приложения: Потоки и параллельная работа

Система создает приложение в основном потоке и вы можете создавать отдельные потоки, если вам это необходимо, для решения каких либо задач. Для приложений iOS, предпочтительным методом является использование Grand Central Dispatch (GCD), оперирущим с объектами, и другиим интерфейсами асинхронного программирования не создавая и управляя потоками собственоручно. Такие технологии как GCD позволяют определить работу, которую вы хотите сделать и в каком порядке вы хотите ее сделать, но пусть система решает как лучше выполнить эту работу для CPU. Когда система управляет вашими потоками вам становиться легче писать код, обспечивается большая корректность кода, а так же увеличивает общую производительность.

Источник

iOS Application Lifecycle, или жизненный цикл iOS приложения

Жизненный цикл ios приложения — обширная и сложная тема. Но как всегда для наших читателей в этой статье будет изложено максимально понятное и наглядное описание процесса жизненного цикла iOS предложения.

жизненный цикл приложения swift ios

Можно в поисковике набрать iOS Application Lifecycle и вы увидите много диаграмм (сложных и не очень), в которых разобраться без пол-литра не получится. Также будет и рисунок, который представлен выше. Эта диаграмма взята их лекций Stanford University, посвященных разработке iOS приложений, но тут она переведена на русский язык.

Давайте разбираться что, зачем и почему…

На самом деле, когда пользователь запускает приложение на устройстве, работает в нем, сворачивает в фон, запускает другое приложение, выгружает его из памяти, само приложение посылает сообщения классу appDelegate, в котором можно эти сообщения поймать и обработать. Также следует понимать, что помимо вызовов методов из класса appDelegate, происходит посыл сообщения NSNotificationCenter с соответствующим содержанием для каждого из состояний приложения.

Обработка событий из различных этапов жизненного цикла iOS приложений очень похожа на обработку событий жизненного цикла View Controller. Т.е. нужно понимать в какой момент какой метод вызывается и что в этот момент времени уже «проинициализировалось», — с чем мы можем в данный момент работать.

Сначала приложение не запущенно. Потом пользователь запускает приложение. Оно переходит в состояние в состояние Foreground, в котором приложение становится сначала Iactive — на этом этапе выполняется код программы, но не обрабатываются события интерфейса пользователя (интерфейс не отображается, касания не обрабатываются и.т.п.). Затем переходит в этап Active, в котором выполняется код и обрабатываются все события UI.

Если пользователь запустит другое приложение, то текущее приложение перейдет в состояние Inactive и затем в состояние Background. В этом состоянии коды выполняется ограниченное время, и не обрабатываются события UI. Нужно понимать, что именно в этом состоянии можно заставить приложения получить, допустим, из интернета самые свежие обновления чего либо, и дать их приложению, что бы когда пользователь вернул приложение в Foreground он мог увидеть эту информацию.

Теперь о методах AppDelegate, которые вызываются во время работы приложения и перехода из одного состояния в другое.

Успешный запуск приложения

На схеме это стрелка №1

Переключение на другое приложение или нажатие копки «Home».

Обычно на этом этапе приостанавливаются какие-то задачи или ставится на паузу игра. В этом месте мы ставим «на паузу» пользовательский интерфейс.

На схеме это стрелка №3

Приложение перешло в состояние Active

Следует перезапустиь все задачи, которые были поствалены на паузу в пердыдущем состянии, или которые не были запущены вовсе. Если приложение пришло из состояния Background опционально обновить интерфейс.

На схеме это стрелка №2

Переход в состояние Background

Тут нужно сохранять пользовательские данные, или сохранять состояние приложения, чтобы оно запустилось с места остановки.

На схеме это стрелка №5

Переход из Background в состояние Foreground

В этом состояние можно сменить все изменения, сделанные в состоянии Background.

Источник

Жизненый цикл приложения iOS

Aleksei Cherepanov

Read more posts by this author.

Aleksei Cherepanov

Данная статья является вольным переводом из официальной документации. В случае каких то неясностей прошу обратиться к первоисточнику: App Programming Guide for iOS

Приложение тесно общается между кодом разработчика и фреймворком системы. Фреймвок предоставляет базовую инфраструктуру, которая необходима приложениям для запуска, а вы предоставляете код необходимый для настройки этой инфраструктуры для того чтобы получить то приложение, которое вы хотите. Это поможет понять инфраструктуру iOS и то, как система работает.

Фреймворки iOS полагаются на паттерн MVC и делегируют эту реализацию. Понимание этих паттернов разработки это ключ к успешной разработки приложений. Это так же помогает в знакомстве с Objective-C и его возможностями. Если вы новичок в iOS программировании, то предлагаем почитать Start Developing iOS Apps Today для введения в iOS приложения и язык Objective-C.

Основная функция

Входной точкой в каждом приложении основанном на C является функция main в iOS приложениях это правильно так же соблюдается. Единственное чем отличается, это то, что в iOS прилоежении вы не должны писать в функцию main самостоятельно. Xcode создает эту функцию как часть основы для вашего проекта. Листинг 2-1 показывает пример этой функции. За исключением нескольких случаев, вы никогда не должны изменять реализацию функции main предоставляемой Xcode.

Листинг 2-1 Функция main приложения iOS

Единственное что можно сказать о функции main это то, что работа передается под управление фреймворка UIKit. Функция UIApplicationMain передает этот процесс созданием объекта ядра вашего приложения, загрузкой пользовательского интерфейса вашего приложения из файлов storyboard, вызовом вашего кода, что дает вам шанс настроить что то во время запуска, и вложение вашего приложения в цикл. Единственной вещью, что вам необходимо предоставить, это файлы storyboard и ваш инициализационный код.

Структура приложения

Во время запуска, функция UIApplicationMain выбирает несколько ключевых объектов и запускает приложение. В сердце каждого iOS приложения лежит объект UIApplication, который способствует взаимодействию между системой и другими объектами приложения. Рисунок 2-1 показывает основные объекты которые можно найти в большинстве приложений, Таблица 2-1 описывает роли которые играет каждый объект. Обратите внимание, что iOS приложение использует MVC архитектуру. Этот паттерн отделяет данные приложение от бизнес-логики и визуальным представлением данных. Эта архитектура ключевая в создании приложения, которое способно запускаться на различных устройствах с различными размерами экрана.

Рисунок 2-1 Ключевые объекты iOS приложения

Таблица 2-1 Роли объектов в iOS приложении

Объект UIApplication управляет циклом событий и другими высокоуровневыми поведением приложения. Он так же сообщает ключ транзакций приложения и некоторые специальные события (такие как приход push-уведомлений) для их делигирования, каждому пользовательскому объекту который вы укажите. Использует объект UIApplication без наследования.

App delegate это сердце вашего кода. Этот объект работает в тандеме с объектом UIApplication во время инициализации, передач, и различных выскоуровневых событиях приложения. Этот объект так же единственный который гарантированно присутствует в каждом приложении, поэтому он часто используется чтобы установить начальные структуры данных приложения.

Documents и data model

Data model хранит данные вашего приложения и является уникальным для вашего приложения. Например, в банковском приложении может храниться база финансовых операций, в то время как приложение для рисования может хранить изображение объекта или даже историю команд рисования, которые привели к созданию этого изображения. (В последнем случае объект изображения по прежнему объект данных, потому что Data model всего лишь контейнер для данных изображения)

Приложение так же может использовать объекты document (Наследованный класс от UIDocument) управляющий некоторыми или всеми его объектами Data model. Объекты Document не обязательны, но предлагают удобный способ для группировки данных, которые принадлежат одному файлу или пакету файлов. Для большей информации читайте Document-Based App Programming Guide for iOS.

View controller управляет отображением данных вашего приложения на экране. View controller управляет одним единственным View и его набором view. Когда происходит отображение, View controller делает view видимыми и устанавливает их в окне приложения.

Класс UIViewController является основным классом для всех объектов view controller. Это обеспечивает функциональность по умолчанию для загрузки view, их отображения, поворота во время поворота устройства, и некоторые другие поведения системы. UIKit и другие фреймворки определяют дополнительный класс view controller реализующий стандартный системный интерфейс такой как выбор изображения, интерфейс с вкладками и навигационный интерфейс.

Для более детальной информации о view controller, смотрите в View Controller Programming Guide for iOS.

Объект UIWindow координирует показом одного или более views на экране. Большинство приложений имеет один объект window, который отображает данные основного экрана, но приложения могут иметь дополнительные window для отображения данных на дополнительных экранах.

Чтобы изменить данные вашего приложения, используйте view controller для изменения отображаемых данный в соответствующем window. Никогда не перемещается сам window.

В дополнение в hosting view, window работает с объектом UIApplication доставляющее события в ваши view и view controller-ы.

View, control, и layer объекты

View и control-ы предоставляют визуальное представление данных вашего приложения. view это объект рисующий данные в разрабатываемой квадратной зоне и возвращает события из этой зоны. Control-ы это специализированный тип view ответственный за реализацию привычных объектов интерфейса таких как кнопки, текстовые поля или переключатели.

Фреймворк UIKit предоставляет стандартные view для отображения различных типов данных. Вы можете переопределить свои собственные view путем наследования непосредственно от класса UIView (или от его потомков).

В дополнение включению view и control, приложение может также включать слои Core Animation со своими иерархиями view и control. Объекты Layer на самом деле являются объектами data для отображения визуальных данных. View используют объекты layer в фоне прежде чем отобразить. Вы так же можете добавить свой собственный объект layer для реализации сложной анимации вашего интерфейса или други типов визуальных эффектов.

Чем отлично одно iOS приложение от другого, это управление данными (и соответствующая бизнес-логика) и то как они представляются пользователю. Большинство взаимодействий объектов UIKit не определяет ваше приложение, но помогает вам усовершенствовать его поведение. Например, методы вашего приложения делегируются когда приложение изменение состояние, что вы определяет в своем коде чтобы отреагировать соответствующим образом.

Основной цикл работы

Основной цикл работы приложения обрабатывает все пользовательские события. Объект UIApplication запускает основной цикл с момента запуска и использует его для обработки события и обработки изменений в интерфейсе. Как следует из названия, основной цикл выполняется в основном потоке приложения. Такое поведение гарантирует, что события связные с пользователем будут обрабатываться последовательно в том порядке в котором они были получены.

На рисунке 2-2 изображена архитектура основного цикла и то как совершается обработка пользовательских событий после их получения в вашем приложении. Когда пользователь взаимодействует с устройством, события, связанные с этим взаимодействием генерируются системой через специальный порт созданный UIKit. События помещаются в очередь внутри приложения и направляются один за другим в основной цикл для исполнения. Объект UIApplication это первый объект который принимает события и принимает решение о том, что с ним должно быть сделано. События касания (touch) обычно направляется на объект главного окна, которое в свою очередь пересылает это сообщение в view, в котором произошло это касание. Другие события могут быть приняты немного другим путями через различные объекты приложения.

Рисунок 2-2 Обработка событий в основном цикле

Таблица 2-2 Основные типы событий в приложении iOS

Объект view на который было совершено нажатие

View принимающий объект. Любое событие связанное с касанием не обрабатываются View а отправляются дальше по цепочке для обработки.

Первый ответивший объект

События удаленного управления существуют для управлением проигрыванием медиа и генерируемые наушниками или другими аксессуарами.

Объект который вы указали

События созданные акселерометром, магнитометром и гироскопом отправляются в объект который вы указали.

Объект который вы указали

Вы регистрируете прием событий локации используя фреймворк Core Location. Для большей информации о использовании Core Location, смотрите Location and Maps Programming Guide.

View который необходимо перерисовать

События перерисовки не вызываются объектами событий, но могу быть вызваны самим View для перерисовки самого себя. Архитектура рисования iOS описана в Drawing and Printing Guide for iOS.

Некоторые события, такие как касание или удаленное управление, могут приниматься ответившими объектами (responder objects). Такие объекты везде в вашем приложении. (Объект UIApplication, ваш view объект, и ваш view controller объекты, все примеры ответивших объектов.) Основными целями событий являются ответившие объекты, но могут быть переданы другими ответившими объектами (через цепочку ответивших (responder chain)) если вам нужно обработать события. Например, view не имеет перехватчика, событие может передать событие через superview или view controller.

Событие касания происходящие в controls (таких как кнопки) и обрабатываются иначе, чем в события касания происходящие на многих других типах view. Как правило, только на ограниченное число взаимодействий возможно с control, и эти события упакованы в action сообщения и отправляются в соответсвующий целевой объект. Этот паттерн, называемый target-action упрощает использование control-ов для включение вашего кода в приложении.

Стадии работы приложения

В любой момент, ваше приложение находиться в одном из стадий указаных в таблице 2-3 Система перемещает приложение от стадии к стадии в соответствии с тем, что происходит в системе. Например, когда пользователь нажал на кнопку Home, телефон принимает выходов, или любое другое прерывание из ряда, запущенное приложение может изменить состояние в ответ. На рисунке 2-3 показаны пути которые приложение принимает при переходите от стадии к стадии.

Таблица 2-3 Стадии приложения

Приложение не было запущено или было выключено системой.

Приложение запущено, но сейчас не принимает события. (Это может произойти из за запуска другого кода.) Приложение обычной остается в этом состоянии только только на короткий промежуток времени, для перехода между состояниями.

Приложение запущено и принимает события. Это нормальный режим для запущенных приложений.

Приложение находиться фоне и обрабатывает код. Большинство приложений попав в это состояние ненадолго прежде чем попасть в состояние suspended. Тем не менее, приложение, которое запрашивает дополнительное время, может оставаться в течении определенного периода времени в этом состоянии. Кроме того, приложение запущенное непосредственно из этого состояния переходит в состояние inactive. Для информации о том как работает код в этом состоянии читайте Background Execution.

Приложение в фоне, но не выполняющее код. Система перемещает приложение в это состояние автоматически и не оповещает его об этом. Когда приложение в suspended, приложение остается в памяти, но не выполняет какой либо код.

Когда возникают события с нехваткой памяти, система может удалить приложения не оповестив его, для того чтобы освободить больше места для открываемых приложений.

Рисунок 2-3 Изменение состояний приложения iOS

Основные перемещения между состояния вызывают определенные методы указанные в объекте приложения. Эти методы дают вам возможность обработать изменение состояний. Эти методы описаны ниже вместе с тем как вы можете использовать их

application:willFinishLaunchingWithOptions:— Этот метод вашего приложения позволяет вам выполнять код во время запуска приложения.

application:didFinishLaunchingWithOptions: — Этот метод позволяет вам перед окончанием запуска выполнить код прежде чем показать ваше приложение пользователю.

applicationDidBecomeActive: — Дает вам знать, что оно становятся foreground приложением. Используйте этот метод для последних приготовлений.

applicationWillResignActive: — Дает вам значит, что приложение уходит из состояния foreground. Используйте этот метод для помещения вашего приложения в режим покоя.

applicationDidEnterBackground: — Дает вам знать, что приложение запущено в фоне и может быть выключено в любое время.

applicationWillEnterForeground: — Дает вам знать, что ваше приложение перемещено из фона обратно в foreground, но то, что оно еще не активно.

applicationWillTerminate: — Дает вам знать, что приложение было выключено. Этот метод не вызывается, если приложение было в состоянии suspended.

Выключение приложения

Suspended приложения не получают уведомления о завершении. Система убивает процесс и восстанавливает соотвествующую память. Если приложение запущено в фоне и не отвечает, система вызовет applicationWillTerminate: чтобы приложение подготовилось к выключаению. Система не вызывает метод когда устройство перезагружается.

В дополнение, система выключает выше приложение, когда пользователь выключил его с помощью интерфейса мультизадачности. Выключение вызванное пользователем вызывает такой же эффект как при выключении suspended приложений. Процевв приложения удаляется без предупреждения отправляемый приложению.

Потоки и параллельная работа

Система создает приложение в основном потоке и вы можете создавать отдельные потоки, если вам это необходимо, для решения каких либо задач. Для приложений iOS, предпочтительным методом является использование Grand Central Dispatch (GCD), оперирущим с объектами, и другиим интерфейсами асинхронного программирования не создавая и управляя потоками собственоручно. Такие технологии как GCD позволяют определить работу, которую вы хотите сделать и в каком порядке вы хотите ее сделать, но пусть система решает как лучше выполнить эту работу для CPU. Когда система управляет вашими потоками вам становиться легче писать кот, обспечивается большая корректность кода, а так же увеличивает общую производительность.

Когда мы думает о потоках и парралельной работе, необхоимо учитывать следующее:

Работа с включающими view, Core Animation, и многими другими классами UIKit которые обычно встречаются в основном потоке приложения. Есть некоторые исключения из этих правилах, например манипулции связанные с изображениями могут встретится в фоновых потоках, но предположим, что работа должна выполняться в основном потоке.

Долго выполняющиеся задачи (или потенциально долгие задачи) должны всегда выполняться в фоновых потоках. Любые задачи связанные с доступом в интернет, к файловой системе или большие обработки данных, все должны выполняться асинхронно с использованием GCD или оперирующими объектами.

Во время запуска, перемещайте задачи из основного потока, когда это возможно. Во время запуска, ваше приложение должно использовать имеющееся время для запуска пользовательского интерфейса на столько быстро на сколько это возможно. Только задачи, которые вносят вклад в создание пользовательского интерфейса должны быть выполнены в основном потоке. Все другие задачи должны выполняться асинхронно, отправляющие результат работы когда он будет готов.

Для больше информации о использовании GCD и оперирующим объектам, обратитесь к Concurrency Programming Guide.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *