大中央调度没有块

是否有可能使用GCD没有块? 有没有一种方法可以像使用_f变体那样使用GCD,正如mikeash在post中所说的那样。 我四处搜寻,双方都没有证据。 这是可能的或不可能的。

如果可以的话请举个例子。

/ Selvin

当然这是可能的! 通过_f变体,Mike只是指带有_f后缀的GCD函数集合。 它们是通常的GCD函数的替代scheme,但可以接受用户定义的函数作为参数而不是块。 有很多:

 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函数与用户定义的函数,它可以通过可变参数(可变参数函数)接受任意数量的参数 – 只需为其编写一个函数包装器。 正如你所看到的_f函数是一个相当强大的机制,并且不仅限于没有GCD参数的块,而且可以使用通常的函数。

是的,你可以,如文章所述:

您可以使用GCD而不使用块,通过每个带有块的GCD函数提供的_fvariables

如果您查看GCD文档,您可以检查变体。 如果你需要一个快速的例子,有很多SO :