iOS. Приемы программирования
Шрифт:
В данном примере мы приказываем среде времени исполнения вызвать метод printString: после трехсекундной задержки. Ту же операцию можно осуществить и в GCD с помощью функций dispatch_after и dispatch_after_f. Обе эти функции описаны далее.
• dispatch_after — направляет блоковый объект в диспетчерскую очередь по истечении заданного периода времени, указываемого в наносекундах. Эта функция требует следующих параметров:
• задержка
• диспетчерская очередь — диспетчерская очередь, в которой должен быть выполнен блоковый объект (указываемый в третьем параметре) после определенной задержки (задаваемой в первом параметре);
• блоковый объект — блоковый объект, который должен быть активизирован в заданной диспетчерской очереди по истечении заданного количества наносекунд. Блоковый объект не должен иметь возвращаемого значения и не должен принимать никаких параметров (см. раздел 7.1).
• dispatch_after_f — направляет функцию на языке C в GCD для выполнения по истечении указанного периода времени, задаваемого в наносекундах. Данная функция принимает четыре параметра:
• задержка в наносекундах — количество наносекунд, в течение которых длится ожидание в определенной диспетчерской очереди в GCD (указываемой во втором параметре), после чего выполняется заданная функция (задаваемая в четвертом параметре);
• диспетчерская очередь — диспетчерская очередь, в которой должна быть выполнена функция на языке C (указываемая во втором параметре) после определенной задержки (задаваемой в первом параметре);
• контекст — адрес в памяти, по которому находится определенное значение, относящееся к неупорядоченному массиву данных (куче). Это значение должно передаваться функции C. Подробнее об этом говорилось в разделе 7.4;
• функция на языке C — адрес функции на языке C, которая должна быть выполнена по истечении определенного периода времени (указываемого в первом параметре) в заданной диспетчерской очереди (указываемой во втором параметре).
Хотя задержки рассчитываются в наносекундах, размерность задержки при диспетчеризации определяется самой системой iOS, и эта величина может быть менее точной, чем та, которую вы указываете в наносекундах.
Сначала рассмотрим пример работ с функцией dispatch_after:
Как видите, параметр задержки в наносекундах для функций dispatch_after и dispatch_after_f должен относиться к типу dispatch_time_t, который является абстрактным представлением абсолютного времени. Чтобы получить значение этого параметра, можно пользоваться функцией dispatch_time так, как показано в данном образце кода. Вот параметры, которые можно сообщать функции dispatch_time.
• Исходное время — если обозначить этот параметр через B, а приращение времени (Delta Parameter) — через D, то результирующее время от этой функции будет равно B+D. Для этого параметра можно задать значение DISPATCH_TIME_NOW, определив таким образом в качестве базового времени настоящий момент, а потом указать приращение, добавляемое к этому времени, используя дельта-параметр.
Приращение, добавляемое к базовому времени, — этот параметр дает количество наносекунд, добавляемых к параметру исходного времени для получения результата данной функции.
Например, чтобы задать временной промежуток 3 с начиная от настоящего момента, можно написать следующий код: