在什么情况下(如果有的话)人们会选择 Swift 中 Grand Central Dispatch 的 `_f` 变体?

In what use case, if any, would one opt for the `_f` variants of Grand Central Dispatch in Swift?

基于 Apple 的 Concurrency Programming Guide and Grand Central Dispatch (GCD) Reference,GCD 调用有两种风格。

"Block" flavor. 可以使用标准 Swift 闭包的 dispatch_block_t flavor:

void dispatch_async( dispatch_queue_t queue, 
                     dispatch_block_t block );

块"closure"在堆栈上分配存储空间

typedef void (^dispatch_block_t)(void);

"Function" 风味。 具有上下文对象和函数指针的 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 *); 

观察结果
根据经验,在 Swift 中使用 _f 例程,如 dispatch_async_fdispatch_sync_f 几乎不存在。

为什么不呢?

是否有任何技术原因或设计模式可以证明在 Swift 应用程序中考虑 Grand Central Dispatch _f context+fuction 变体?

只有 Objective-C 和 Swift 的语法与 GCD 中基于 block/closure 的 API 兼容。鉴于 GCD API 是低级的并且设计用于与其他语言一起工作,_f 变体允许传递一个函数(即,您可以将它们与 C 语言程序一起使用)。

为了回答您的实际问题,可能没有特别好的理由在 Swift 中使用基于 API 的函数。使用 _f 变体时可能会获得性能提升,但除非您在短时间内分派数千次调用,否则它可能可以忽略不计(GCD/Run 循环的开销可能使它成为无论如何,对这类事情来说都是糟糕的做法。

实际上,Swift 中 *_f() 版本的使用为零。但是,如果您正在编写 C 代码或预闭包 Obj-C,那么它们是执行回调的惯用方式,因为不支持闭包。只需 GitHub 搜索 C 中的那些调用,您就会,呃,明白 我的意思。 https://github.com/search?utf8=%E2%9C%93&q=dispatch_async_f+language%3AC&type=Code&ref=searchresults