根据Apple的并发编程指南和GCD参考,GCD调用有两种方式。
"块"的味道。可以使用标准Swift闭包的dispatch_block_t
版本:
void dispatch_async( dispatch_queue_t queue,
dispatch_block_t block );
其中block "closure"在栈上分配存储
typedef void (^dispatch_block_t)(void);
"功能"的味道。具有上下文对象和函数指针的dispatch_function_t
风格。
void dispatch_async_f( dispatch_queue_t queue,
void *context,
dispatch_function_t work );
应用程序定义的上下文对象作为void *
对象指针参数传递给调度函数work
。
typedef void (*dispatch_function_t)(void *);
观察
根据经验,像dispatch_async_f
和dispatch_sync_f
这样的_f
例程在Swift中几乎不存在。
- github search: dispatch_async_f language:Swift
- github search: dispatch_sync_f language:Swift
为什么不呢?
是否有任何技术原因或设计模式证明在Swift应用程序中考虑Grand Central Dispatch_f
上下文+函数变体是合理的? 只有Objective-C和Swift有与GCD中基于块/闭包的API兼容的语法。考虑到GCD API是低级的,并且被设计为与其他语言一起工作,_f变量允许传递一个函数(也就是说,你可以在C语言程序中使用它们)。
回答你的实际问题,可能没有特别好的理由在Swift中使用基于函数的API。当使用_f变量时,可能会有性能上的优势,但除非你在短时间内调度成千上万的调用,否则它可能是可以忽略不计的(并且GCD/Run Loops的开销可能使这种方法无论如何都是一种糟糕的方法)。
实际上,*_f()
版本在Swift中没有任何用处。但是,如果您正在编写C代码或预闭包Obj-C,那么它们是执行回调的惯用方法,因为不支持闭包。只要在GitHub中搜索C中的这些调用,你就会看到我的意思。https://github.com/search?utf8=%E2%9C%93& q = dispatch_async_f +语言% 3 ac& type = Code& ref = searchresults