0

是否可以在没有块的情况下使用 GCD?正如 mikeash 在他的帖子中所说,有没有办法使用 _f 变体来使用 GCD 。我四处寻找,双方都没有证据。是可能还是不可能。

如果可行,请举个例子。

/塞尔文

4

2 回答 2

3

当然有可能!_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);

或者传递一个函数指针作为参数。或者相反,您可以将_fGCD 函数的变体与用户定义的函数一起使用,这些函数可以通过 varargs(可变参数函数)接受任意数量的参数 - 也如上所述为其编写函数包装器。如您所见,_f函数是一种相当强大的机制,您不仅限于没有 GCD 参数的块,还可以使用常用函数。

于 2013-07-23T14:26:12.783 回答
1

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

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

如果您查看GCD 文档,您可以检查变体。如果你需要一个简单的例子,那么 SO 上有很多

于 2013-07-23T13:29:42.427 回答