在什么情况下(如果有的话)人们会选择 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_f
和 dispatch_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
基于 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_f
和 dispatch_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