是否可以在没有块的情况下使用 GCD?正如 mikeash 在他的帖子中所说,有没有办法使用 _f 变体来使用 GCD 。我四处寻找,双方都没有证据。是可能还是不可能。
如果可行,请举个例子。
/塞尔文
是否可以在没有块的情况下使用 GCD?正如 mikeash 在他的帖子中所说,有没有办法使用 _f 变体来使用 GCD 。我四处寻找,双方都没有证据。是可能还是不可能。
如果可行,请举个例子。
/塞尔文
当然有可能!_f
变体 Mike 只是指带有后缀的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(可变参数函数)接受任意数量的参数 - 也如上所述为其编写函数包装器。如您所见,_f
函数是一种相当强大的机制,您不仅限于没有 GCD 参数的块,还可以使用常用函数。