是否可以使用无障碍的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/

10-13 04:07