Особое назначение блоков
Наряду с диспетчером GCD компания Apple внедрила новый синтаксис в язык С, а также в его разновидности Objectlve-C и C++ для реализации языкового средства, называемого блоками (blocks), а в других языках программирования — замыканиями (closures) и лямбда-выражениями (lambdas). Этот синтаксис играет очень важную роль в извлечении максимальной пользы из диспетчера GCD. Принцип действия блока заключается в том, чтобы дать возможность обращаться с отдельным фрагментом кода таким же образом, как и с любым другим типом языка С. Блок можно присваивать переменной, передавать в качестве аргумента функции или методу и даже выполнять, в отличие от большинства других типов. В этом отношении блоки можно использовать в качестве альтернативы шаблону делегата в языке Objective-C или функциям обратного вызова в С. Подобно методу или функции, блок может принимать один или несколько параметров и указывать возвращаемое значение. Переменная блока объявляется с помощью символа "шапочка" (А) и круглых скобок, в которые заключаются параметры и возвращаемые типы. В то же время для того чтобы определить сам блок, нужно сделать приблизительно то же самое, но, кроме того, указать конкретный код, определяющий блок и заключенный в фигурные скобки, как показано ниже.
Если у вас имеется солидный опыт программирования на С, вы, вероятно, признаете, что блок чем-то напоминает указатель функции в С, хотя у него имеется ряд принципиальных отличий. Самое главное и разительное, на первый взгляд, отличие заключается в том, что блок можно объявить встроенным в код, т.е. прямо в том месте, где его требуется передать другому методу или функции. Еще одно существенное отличие состоит в том, что блоку могут быть доступны переменные из той области действия, в которой он создан. По умолчанию блок создает копию любой доступной подобным образом переменной, не затрагивая оригинал.
В первой строке кода, выделенной выше полужирным, с помощью функции dispatch get_global_queue () выбирается уже существующая глобальная очередь, которая всегда доступна. Эта функция принимает два аргумента: в первом из них указывается приоритет, а второй аргумент в настоящее время не используется и поэтому должен всегда быть равен нулю.
- Дата: 1-01-2015, 20:55