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

на главную

Жанры

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

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

Шрифт:

#import «AppDelegate.h»

@interface AppDelegate 

@property (nonatomic, unsafe_unretained)

UIBackgroundTaskIdentifier backgroundTaskIdentifier;

@property (nonatomic, strong) NSTimer *myTimer;

@end

@implementation AppDelegate

<# Остаток вашего кода находится здесь #>

Теперь создадим таймер и назначим время перехода приложения в фоновый режим:

— (BOOL) isMultitaskingSupported{

BOOL result = NO;

if ([[UIDevice currentDevice]

respondsToSelector:@selector(isMultitaskingSupported)]){

result = [[UIDevice currentDevice] isMultitaskingSupported];

}

return result;

}

— (void) timerMethod:(NSTimer *)paramSender{

NSTimeInterval backgroundTimeRemaining =

[[UIApplication sharedApplication] backgroundTimeRemaining];

if (backgroundTimeRemaining == DBL_MAX){

NSLog(@"Background Time Remaining = Undetermined");

} else {

NSLog(@"Background Time Remaining = %.02f Seconds",

backgroundTimeRemaining);

}

}

— (void)applicationDidEnterBackground:(UIApplication *)application{

if ([self isMultitaskingSupported] == NO){

return;

}

self.myTimer =

[NSTimer scheduledTimerWithTimeInterval:1.0f

target: self

selector:@selector(timerMethod:)

userInfo: nil

repeats: YES];

self.backgroundTaskIdentifier =

[application beginBackgroundTaskWithExpirationHandler: ^(void) {

[self endBackgroundTask];

}];

}

Как видите, в обработчике завершения (Completion Handler) фоновой задачи мы вызываем метод endBackgroundTask делегата приложения. Этот метод написали мы сами, и выглядит он так:

— (void) endBackgroundTask{

dispatch_queue_t mainQueue = dispatch_get_main_queue;

__weak AppDelegate *weakSelf = self;

dispatch_async(mainQueue, ^(void) {

AppDelegate

*strongSelf = weakSelf;

if (strongSelf!= nil){

[strongSelf.myTimer invalidate];

[[UIApplication sharedApplication]

endBackgroundTask: self.backgroundTaskIdentifier];

strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;

}

});

}

Есть еще пара моментов, которые нужно дополнительно уладить после завершения долгосрочной задачи:

• завершить все потоки и таймеры независимо от того, являются они таймерами из фреймворка Core Foundation или созданы с помощью GCD;

• завершить фоновую задачу, вызвав метод endBackgroundTask: класса UIApplication;

• пометить задачу как завершенную, присвоив значение UIBackgroundTaskInvalid идентификаторам задачи.

И последнее, но немаловажное. Если приложение выходит в приоритетный режим, а долгосрочная задача все еще не завершена, необходимо гарантированно от нее избавиться:

— (void)applicationWillEnterForeground:(UIApplication *)application{

if (self.backgroundTaskIdentifier!= UIBackgroundTaskInvalid){

[self endBackgroundTask];

}

}

В нашем примере, как только приложение переходит в фоновый режим, мы запрашиваем дополнительное время на завершение долгосрочной задачи (в данном случае, например, для выполнения кода нашего таймера). В то время мы регулярно считываем значение свойства backgroundTimeRemaining экземпляра класса UIApplication и выводим найденное значение на консоль. В методе экземпляра beginBackgroundTaskWithExpirationHandler:, который относится к классу UIApplication, мы записали код, который будет выполнен прямо перед тем, как закончится дополнительное время, выделенное приложению на выполнение долгосрочной задачи. (Как правило, это происходит за 5–10 секунд до истечения времени, выделенного на выполнение задачи.) Здесь мы можем просто завершить задачу, вызвав метод экземпляра endBackgroundTask:, относящийся к классу UIApplication.

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

См. также

Раздел 14.1.

14.3. Добавление возможностей фонового обновления в приложения

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

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

Решение

Добавьте в приложение возможность фонового обновления (background fetch).

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

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Неправильный лекарь. Том 1

Измайлов Сергей
1. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неправильный лекарь. Том 1

Студиозус 2

Шмаков Алексей Семенович
4. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус 2

Воплощение Похоти 3

Некрасов Игорь
3. Воплощение Похоти
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Воплощение Похоти 3

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

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

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21

Печать зверя

Кас Маркус
7. Артефактор
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Печать зверя

ЖЛ 9

Шелег Дмитрий Витальевич
9. Живой лёд
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
ЖЛ 9

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

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

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

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга