在什么用例中,如果有的话,人们会选择Swift中Grand Central Dispatch的' _f '变体



根据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_fdispatch_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

最新更新