Гранд Сентрал Диспетчер без блоков

Можно ли использовать 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 есть много:

Другие вопросы по тегам