没有街区的Grand Central Dispatch

时间:2013-07-23 13:20:56

标签: ios macos grand-central-dispatch libdispatch

是否可以在没有块的情况下使用GCD?有没有办法使用_f变体来使用GCD,正如mikeash在他的post中所说的那样。我四处搜寻,没有证据证明任何一方。是可能的还是不可能的。

如果可行,请举例。

/ Selvin

2 个答案:

答案 0 :(得分:3)

当然有可能!根据{{​​1}}变体,迈克只是指具有_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

或者将函数指针作为参数传递。或者相反,您可以使用GCD函数的void func(void) { //do any calculations you want here } void wrapper_function(void*) { func(); } dispatch_async_f(queue, 0, &wrapper_function); 变体和用户定义的函数,这些函数可以通过varargs(可变参数函数)接受任意数量的参数 - 只需为它编写函数包装器,如上所述。如您所见,_f函数是一种强大的机制,您不仅限于没有GCD参数的块,而且可以使用常用函数。

答案 1 :(得分:1)

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

  

您可以使用不带块的GCD,通过为每个提供的_f变体   采用块的GCD函数

如果查看GCD documentation,可以查看变体。如果您需要快速示例there are many on SO