Дополнительное время
В предыдущем вызове метода beginBackgroundTaskWithExpirationHandler: возвращалось специальное значение UIBackgroundTasklnvalid, которое обозначает, что система отказывается вообще предоставлять дополнительное время. В таком случае можно попытаться выполнить самую быструю часть необходимой работы в надежде уложиться в отведенный пятисекундный срок. К такому приему, вероятнее всего, придется прибегнуть для выполнения приложений на старых моделях мобильных устройств, например iPhone 3G, которые не поддерживают многозадачность, хотя и позволяют выполнять приложения под управлением системы iOS 4. Однако в данном случае мы обходим такую возможность, просто сообщая о том, что запустить фоновое задание на выполнение не удалось.
Далее следует самая интересная часть кода, в которой фактически выполняется сама работа.
В этой части кода работа, выполнявшаяся рассматриваемым здесь методом в первую очередь, помещается в очередь фоновых заданий. В конце данной части кода вызывается метод endBackgroundTask:, уведомляющий систему о завершении работы в фоновом режиме.
Итак, внеся упомянутые выше изменения в код, скомпилируйте и запустите данное приложение на выполнение, а затем переведите его в фоновое состояние, нажав кнопку возврата в исходное состояние и наблюдая как за консолью Xcode, так и за строкой состояния в нижней части окна Xcode. На этот раз вы должны заметить, что приложение продолжает выполняться (в строке состояния не появляется сообщение "Debugging terminated"), а десять секунд спустя увидите результаты окончательного вывода в журнал консольных сообщений. В результате полного выполнения данного приложения на консоль должны быть выведены следующие строки сообщений (на экране каждое из этих сообщений состоит из одной неразрывной строки.
Как видите, система намного щедрее выделила время на выполнение операций в фоновом режиме, чем в основном потоке приложения. Благодаря этому, придерживаясь рассмотренной выше процедуры, вы можете поспособствовать успешному выполнению любых текущих заданий в своем приложении.
Следует иметь в виду, что в данном примере мы запросили единственный идентификатор фонового задания, но на практике их можно запросить сколько угодно. Так, если во время работы в фоновом режиме происходят сетевые пересылки данных, которые нужно непременно завершить, на каждую из них можно запросить отдельный идентификатор, чтобы продолжить их выполнение в очереди фоновых заданий. Это дает возможность распараллелить выполнение многих операций в течение имеющегося времени.
- Дата: 8-01-2015, 22:34