iOS. Приемы программирования
Шрифт:
1. applicationWillEnterForeground:.
2. applicationDidBecomeActive:.
Наряду с этими сообщениями мы будем получать разнообразные уведомления от iOS, когда приложение будет переходить в фоновый режим или возвращаться в приоритетный.
Чтобы можно было сохранять и вновь загружать состояние наших приложений, нужно тщательно взвешивать, выполнение каких задач следует приостановить, переходя в фоновый режим, а возобновить — лишь когда программа вернется в приоритетный режим. Рассмотрим пример. Сама система может с легкостью восстанавливать сетевые соединения. Поэтому мы можем ничего специально не предпринимать, если качаем файл из Сети. Но когда мы, например, пишем игру, лучше слушать те уведомления,
После того как приложение отправлено в фоновый режим, у него есть около 10 секунд, чтобы сохранить все несохраненные данные и приготовиться к тому, чтобы вернуться в приоритетный режим в любой момент, когда этого потребует пользователь. При необходимости можно также запросить у операционной системы дополнительное время на исполнение этих функций (подробнее об этом рассказано в разделе 14.2).
Рассмотрим сохранение состояния на примере. Предположим, мы пишем игру для iOS. Когда игра отправляется в фоновый режим, нам нужно сделать следующее.
1. Приостановить игровой движок.
2. Сохранить на диск очки, заработанные пользователем.
3. Сохранить на диск информацию об уровне, на котором остановилась игра. В частности, будем сохранять точку, которой пользователь достиг на этом уровне, физические аспекты уровня, положение камеры и т. д.
Когда пользователь снова откроет игру, переводя приложение в приоритетный режим, нам нужно выполнить следующее.
1. Загрузить с диска заработанные пользователем очки.
2. Загрузить с диска тот уровень, на котором пользователь прервал игру.
3. Возобновить работу игрового движка.
А теперь предположим, что делегат нашего приложения — это игровой движок. Определим в заголовочном файле делегата приложения несколько методов:
Переходим к работе с заглушками методов, уже присутствующими в файле реализации делегата приложения:
Теперь нужно удостовериться, что наше приложение способно обрабатывать прерывания, в частности входящие звонки, поступающие на iPhone. В таких случаях приложение не будет переходить в фоновый режим, но тем не менее станет неактивным. Если, например, пользователь закончит телефонный разговор, то iOS вернет наше приложение в активное состояние. Итак, когда приложение становится неактивным, нужно убедиться, что приостановлена работа игрового движка. Когда приложение снова активизируется, работу игрового движка можно возобновить. На самом деле, когда приложение становится неактивным, перед нами не стоит необходимость сохранять все на диске (как минимум в этом примере), так как iOS вернет приложение в предыдущее состояние лишь после того, как приложение вновь станет активным:
Теперь все просто. Как только наше приложение уйдет в фоновый режим, мы сохраним состояние этой программы, а когда она вернется в приоритетный режим — вновь загрузим это состояние:
Разумеется, не всякое приложение — это игра. Но описанными приемами можно пользоваться для загрузки и сохранения состояния приложений в многозадачной среде iOS.
См. также
Раздел 14.2.
14.7. Управление сетевыми соединениями в фоновом режиме
Постановка задачи
Вы применяете экземпляры класса NSURLConnection для получения данных с веб-сервера и отправки информации на сервер. Возникает вопрос: как гарантировать работу ваших приложений в многозадачной среде iOS, надежно застраховавшись от сбоев в соединениях.