Гранд Сентрал Диспетчер без блоков
Можно ли использовать GCD без блоков? Есть ли способ использовать GCD, используя вариант _f, как говорит mikeash в своем посте. Я искал вокруг, и нет никаких доказательств для обеих сторон. это возможно или невозможно.
Если это возможно, приведите пример.
/ Selvin
2 ответа
Конечно, это возможно! От _f
Варианты Майка просто означают множество GCD
функции с _f
суффикс. Они являются альтернативой обычному GCD
функции, но могут принимать пользовательскую функцию в качестве параметра вместо блоков. Их много:
dispatch_async_f
dispatch_sync_f
dispatch_after_f
dispatch_apply_f
dispatch_group_async_f
dispatch_group_notify_f
dispatch_set_finalizer_f
dispatch_barrier_async_f
dispatch_barrier_sync_f
dispatch_source_set_registration_handler_f
dispatch_source_set_cancel_handler_f
dispatch_source_set_event_handler_f
Они принимают dispatch_function_t
параметр (вместо обычного dispatch_block_t
) который определяется следующим образом:
typedef void (*dispatch_function_t)(void*)
,
Как видите, он может принимать любой пользовательский параметр, а также функцию из-за *void
указатель. Так что вы даже можете использовать dispatch_function_t
с функцией, у которой нет аргументов - вы можете просто написать функцию-обёртку так:
void func(void) {
//do any calculations you want here
}
void wrapper_function(void*) { func(); }
dispatch_async_f(queue, 0, &wrapper_function);
Или передайте указатель на функцию в качестве параметра. Или наоборот вы можете использовать _f
варианты функций GCD с пользовательскими функциями, которые могут принимать любое количество аргументов через varargs (variadic functions) - просто напишите для него оболочку функции, как описано выше. Как вы видите _f
Функции - довольно мощный механизм, и вы не ограничены только блоками без параметров для GCD, но можете использовать обычные функции.
Да, вы можете, как указано в статье:
Вы можете использовать GCD без блоков, используя варианты _f для каждой функции GCD, которая принимает блок
Если вы посмотрите документацию GCD, вы можете проверить варианты. Если вам нужен быстрый пример , на SO есть много: