Рисование средствами Quartz и OpenGL
Скомпилируйте и запустите данное приложение на выполнение, а затем нажмите кнопку возврата в исходное состояние, наблюдая за строкой состояния в нижней части консоли Xcode. Через несколько секунд в этой строке появится текстовое сообщение "Debugging terminated". Это означает, что поведение данного приложения признано в системе iOS (или имитаторе системы iOS) неприемлемым, и поэтому оно удалено из оперативной памяти!
Однако положение не столь безнадежно, поскольку из него есть вполне достойный выход. В этом случае мы воспользуемся уже знакомыми нам средствами, диспетчером GCD и блоками, чтобы организовать выполнение содержимого метода applicationDidEnterBackground в отдельной очереди. С этой целью внесите в данный метод следующие изменения.
В этом фрагменте кода вызывается метод beginBackgroundTaskWithExpirationHandl ег, возвращающий идентификатор, который нам потребуется отслеживать в дальнейшем. С этой целью мы объявили переменную taskld с помощью описателя хранения block, поскольку должны быть уверены, что идентификатор, возвращаемый данным методом, будет разделяемым среди любых блоков, создаваемых в этом методе.
Вызывая метод beginBackgroundTaskWithExpirationHandler, мы, по существу, сообщаем системе, что нам нужно больше времени на выполнение определенной работы, но обещаем уведомить ее, когда эта работа будет завершена. Блок, который мы передаем данному методу в качестве параметра, может быть вызван в том случае, если система посчитает, что мы выполняем работу слишком долго и что этому пора положить конец.
Обратите внимание на то, что передаваемый нами блок завершается вызовом метода endBackgroundTask, которому переменная taskld передается в качестве параметра. Этим мы сообщаем системе о завершении работы, на выполнение которой ранее запросили дополнительное время. Каждый вызов метода beginBackgroundTaskWithExpirationHandler очень важно согласовать с вызовом метода endBackgroundTask, чтобы своевременно уведомить систему о завершении работы.
- Дата: 8-01-2015, 16:50