Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

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

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

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

14.6. Сохранение и загрузка состояния приложений iOS, использующих многозадачность

Постановка задачи

Необходимо, чтобы при отправке приложения для iOS в фоновый режим его состояние сохранялось и восстанавливалось, как только приложение вернется в приоритетный режим.

Решение

Комбинируйте сообщения протокола UIApplicationDelegate, отправляемые делегату вашего приложения, и уведомления, которые посылает система iOS. Так вы сможете сохранять состояние приложений.

Обсуждение

Допустим, пустое приложение iOS (то есть приложение всего с одним окном, для которого еще не написан код) впервые запускается на устройстве с iOS, поддерживающем работу в многозадачном режиме. Оно запускается именно впервые, а не возвращается из фонового режима в приоритетный. В таком случае делегат приложения UIApplicationDelegate будет получать следующие сообщения именно в таком порядке.

1. application: didFinishLaunchingWithOptions:.

2. applicationDidBecomeActive:.

Если пользователь нажимает кнопку Home (Домой) на своем устройстве с iOS, то делегат приложения получит следующие сообщения в таком порядке.

1. applicationWillResignActive:.

2. applicationDidEnterBackground:.

Когда приложение находится в фоновом режиме, пользователь может дважды нажать кнопку Home (Домой) и выбрать нашу программу из списка фоновых приложений. (При этом не так уж важно, каким именно образом программа оказалась в фоновом режиме. Насколько мне известно, другое приложение может запустить наше посредством различных URI-схем, которые мы можем предоставить в нашей программе.) Как только программа вернется в приоритетный режим, делегат приложения получит следующие сообщения в таком порядке.

1. applicationWillEnterForeground:.

2. applicationDidBecomeActive:.

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

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

на паузу» игровой движок. Это же при необходимости можно проделать и со звуковым движком.

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

Рассмотрим сохранение состояния на примере. Предположим, мы пишем игру для iOS. Когда игра отправляется в фоновый режим, нам нужно сделать следующее.

1. Приостановить игровой движок.

2. Сохранить на диск очки, заработанные пользователем.

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

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

1. Загрузить с диска заработанные пользователем очки.

2. Загрузить с диска тот уровень, на котором пользователь прервал игру.

3. Возобновить работу игрового движка.

А теперь предположим, что делегат нашего приложения — это игровой движок. Определим в заголовочном файле делегата приложения несколько методов:

#import <UIKit/UIKit.h>

@interface AppDelegate: UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;

/* Сохраняем состояние нашего приложения. */

— (void) saveUserScore;

— (void) saveLevelToDisk;

— (void) pauseGameEngine;

/* Загружаем состояние нашего приложения. */

— (void) loadUserScore;

— (void) loadLevelFromDisk;

— (void) resumeGameEngine;

@end

Переходим к работе с заглушками методов, уже присутствующими в файле реализации делегата приложения:

#import «AppDelegate.h»

@implementation AppDelegate

— (void) saveUserScore{

/* Здесь сохраняем очки, заработанные пользователем. */

}

— (void) saveLevelToDisk{

/* Сохраняем на диске текущий уровень и положение игрока

на карте этого уровня. */

}

— (void) pauseGameEngine{

Поделиться:
Популярные книги

Дважды одаренный. Том III

Тарс Элиан
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.00
рейтинг книги
Дважды одаренный. Том III

Двойник Короля 7

Скабер Артемий
7. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 7

Золото Советского Союза: назад в 1975

Майоров Сергей
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Золото Советского Союза: назад в 1975

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Командор космического флота

Борчанинов Геннадий
3. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Командор космического флота

Император Пограничья 5

Астахов Евгений Евгеньевич
5. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 5

Ренегат космического флота

Борчанинов Геннадий
4. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Ренегат космического флота

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Законы Рода. Том 3

Андрей Мельник
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

Ратник

Ланцов Михаил Алексеевич
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Ратник

Черный Маг Императора 14

Герда Александр
14. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 14

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

Отморозок 1

Поповский Андрей Владимирович
1. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 1