是否可以在没有块的情况下使用GCD?有没有办法使用_f变体来使用GCD,正如mikeash在他的post中所说的那样。我四处搜寻,没有证据证明任何一方。是可能的还是不可能的。
如果可行,请举例。
/ Selvin
答案 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: