Нахавандипур Вандад
Шрифт:
Как видите, мы пытаемся активизировать блоковый объект executedOnlyOnce дважды с помощью функции dispatch_once, но на самом деле GCD выполняет этот блоковый объект лишь однажды, поскольку идентификатор, передаваемый функции dispatch_once, оба раза один и тот же.
В руководстве Cocoa Fundamentals Guide (Руководство по основам Cocoa) Apple объясняется, как создавать синглтон. Исходный код довольно старый и еще не обновлен с учетом использования GCD и автоматического подсчета ссылок. Мы можем изменить эту модель, чтобы можно было пользоваться GCD и функцией dispatch_once. В результате мы сможем создавать совместно используемый экземпляр объекта:
7.9. Объединение задач в группы с помощью GCD
Постановка задачи
Требуется объединять блоки кода в группы и гарантировать, что GCD будет выполнять все задачи одну за другой, выстраивая таким образом зависимости между ними.
Решение
Для создания групп в GCD пользуйтесь функцией dispatch_group_create.
Обсуждение
GCD позволяет создавать группы. Пользуясь группами, можно поместить несколько задач в одном месте, выполнить их все, а по завершении работы получить об этом уведомление от GCD. Такая технология имеет большое прикладное значение. Допустим, например, что у вас есть приложение с пользовательским интерфейсом и вы хотите перезагрузить его компоненты в этом пользовательском интерфейсе. В пользовательском интерфейсе у вас имеется табличный вид, прокручиваемый вид и вид с изображением. Вы хотите перезагрузить содержимое этих компонентов с помощью следующих методов:
На данный момент эти методы пусты, но вы можете позже поместить в них важный код, связанный с пользовательским интерфейсом. Сейчас мы собираемся вызвать эти три метода один за другим и узнать, когда GCD закончит вызывать эти методы, в результате чего мы отобразим соответствующее сообщение для пользователя. Для этого нам придется воспользоваться группой. При работе с группами в GCD необходимо иметь представление о трех функциях:
• dispatch_group_create — создает описатель группы;
• dispatch_group_async — отправляет блок кода в группу для выполнения. Необходимо указать диспетчерскую очередь, в которой должен выполняться этот блок кода, а также группу, к которой этот блок кода относится;
• dispatch_group_notify — позволяет отправить блоковый объект, который необходимо выполнить после того, как все задачи, направленные в группу для выполнения, закончат свою работу. Эта функция также позволяет указывать диспетчерскую очередь, в которой должен выполняться данный блоковый объект.