是否可以使用无障碍的GCD?正如mikeash在他的post中所说,有没有一种方法可以使用_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);
或将函数指针作为参数传递。或相反,您可以将GCD函数的
_f
变体与用户定义的函数一起使用,这些变体可以通过varargs(可变函数)接受任意数量的参数-只需如上所述为其编写函数包装即可。如您所见,_f
函数是一种功能强大的机制,不仅限于没有GCD参数的块,而且可以使用常规函数。关于ios - 大中央分派(dispatch)中心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17811414/