Задержка выполнения дискреционных задач

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

Используя действие XPC

Действие XPC API может запросить централизованное планирование дискреционных задач в Вашем приложении. Действие XPC является частью XPC, низкоуровневого механизма межпроцессорного взаимодействия. Используйте Действие XPC API, чтобы сказать системе, что у Вас есть работа, которая может быть задержана, сколько времени это может быть задержано, и должно ли это быть задержано, пока компьютер не включается в питание переменным током.

Когда пользователи будут работать от заряда батареи, используйте XPC Services API для задержки выполнения низкого приоритета дискреционные задачи, такие как:

Код в Перечислении 4-1 определяет и регистрирует словарь XPC, указывающий дискреционную операцию по техобслуживанию, которая может быть задержана с 1 до 12 часов. На основе этого словаря XPC выполняет блок кода, выполняющий действие в его собственной очереди в подходящее время, не вмешивающееся во время работы от батареи пользователя.

Перечисление 4-1  , Позволяющее дискреционное действие быть задержанным в течение 12 часов

   // Create an empty XPC dictionary:
xpc_object_t criteria = xpc_dictionary_create(NULL, NULL, 0);
   // Tell XPC that this is a non-repeating activity:
xpc_dictionary_set_bool(criteria, XPC_ACTIVITY_REPEATING, FALSE);
   // The activity should start in 1 hour (3600 seconds),
xpc_dictionary_set_int64(criteria, XPC_ACTIVITY_DELAY, XPC_ACTIVITY_INTERVAL_1_HOUR,);
   // but XPC can defer the activity by as much as 12 hours:
xpc_dictionary_set_int64(criteria, XPC_ACTIVITY_GRACE_PERIOD, 12 * XPC_ACTIVITY_INTERVAL_1_HOUR,);
   // Pass XPC_ACTIVITY_PRIORITY_MAINTENANCE to indicate that this is a user-invisible activity:
xpc_dictionary_set_string(criteria,XPC_ACTIVITY_PRIORITY, XPC_ACTIVITY_PRIORITY_MAINTENANCE);
   // Register the new XPC dictionary and pass it the handler block that performs the activity
xpc_activity_register("com.myapp.MySimpleActivity", criteria, ^(xpc_activity_t activity)
     {
      /* do background work here */ 
     });

Используя константы действия XPC

Вот некоторые константы, которые можно использовать в словаре критериев Действия XPC для описания действий (это не полный список):

Постоянный
Описание

XPC_ACTIVITY_ALLOW_BATTERY

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

XPC_ACTIVITY_ALLOW_BATTERY значения по умолчанию к YES для UTILITY и NO для MAINTENANCE приоритетные действия, но константа могут быть переопределены в любом случае.

XPC_ACTIVITY_PRIORITY_MAINTENANCE

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

XPC_ACTIVITY_PRIORITY_UTILITY

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

Для получения дополнительной информации о константах Действия XPC, см. activity.h Ссылку. Для получения дополнительной информации о XPC Services, см. Руководство по программированию Демонов и Служб.

Информирование системы о долгих действиях

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

Если Ваше приложение выполняет фоновую работу, которая не может быть задержана, пока пользователь не включает компьютер в питание переменным током, Вы не можете использовать централизованное планирование задач. Вместо этого используйте любой из методов beginActivityWithOptions:reason: или performActivityWithOptions:reason:usingBlock: и передача NSActivityBackground постоянный. Эти методы описаны в, Улучшают Дремоту Приложения Информированием Системы О Долгих Действиях.