Swift 3 beta 5中DispatchQueue的AutoreleaseFrequency

Mat*_*man 17 grand-central-dispatch swift swift3 xcode8

在Xcode 8 beta 5中,初始化程序DispatchQueue已更改为接受qos(服务质量),属性和自动释放频率的单独参数.虽然我将代码转换为使用新的初始化程序时没有任何问题,但我不确定某些属性的含义,特别是自动释放频率.

例如,在Xcode 8 beta 3和Swift 3中,我能够创建一个序列DispatchQueue:

let serialQueue = DispatchQueue(label: "Concurrent Map", attributes: [.serial, .qosBackground], target: nil)
Run Code Online (Sandbox Code Playgroud)

在Xcode 8 beta 5和Swift 3中:

let serialQueue = DispatchQueue(label: "Concurrent Map", qos: .background, attributes: [], autoreleaseFrequency: .inherit, target: nil)
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 在新的DispatchQueue.Attributes中,.serial不再是成员.这是否意味着缺少.concurrent会创建一个串行队列.我在Swift Playgrounds做的初步测试似乎证实了这一点.其他人可以确认吗?
  • 我看到DispatchQueue.AutoreleaseFrequency是一个带有.inherit,.never和.workItem的新类型.这些是什么意思?我做了一些关于GCD和自动释放的研究,但我不太熟悉自动释放池的概念.

zum*_*zum 29

我发现Mark给出的答案是"主观的",正如他所说的那样,文档中还没有官方文档.但是,您可以在代码中找到官方文档,因此我会给出我认为应该是正确答案的内容,因为它纯粹基于代码文档中的内容而不是意见.这里是:

DISPATCH_AUTORELEASE_FREQUENCY_INHERIT 具有此自动释放频率的Dispatch队列继承其目标队列中的行为.这是手动创建的队列的默认行为.

DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM 使用此自动释放频率推送调度队列,并围绕执行异步提交给它的每个块弹出自动释放池.

DISPATCH_AUTORELEASE_FREQUENCY_NEVER 使用此自动释放频率的调度队列永远不会在执行异步提交的块的过程中设置单独的自动释放池.这是全局并发队列的行为.


Mar*_*sey 14

我找不到任何关于这些新属性的官方文档(它可能正在进行中),但鉴于现有的GCD文档以及读取行之间的内容,很容易直观地了解这里的内容.

在新的DispatchQueue.Attributes中,.serial不再是成员.这是否意味着缺少.concurrent会创建一个串行队列.我在Swift Playgrounds做的初步测试似乎证实了这一点.其他人可以确认吗?

是.队列是串行或并发的.您创建的大多数队列都是串行的,因此如果您不想要默认行为,则只需将它们设置为并发.

我看到DispatchQueue.AutoreleaseFrequency是一个带有.inherit,.never和.workItem的新类型.这些是什么意思?我做了一些关于GCD和自动释放的研究,但我不太熟悉自动释放池的概念.

以前,DispatchQueues会在未指定的时间(当线程变为非活动状态时)弹出自动释放池.实际上,这意味着您要么为您提交的每个调度项创建一个自动释放池,要么您的自动释放对象会在不可预测的时间内闲置.

非确定性不是一件好事(特别是在并发库中!),因此它们现在允许您指定三种行为之一:

.inherit:不确定,可能是以前的默认行为

.workItem:为每个被执行的项创建并释放自动释放池

.never:GCD不为您管理自动释放池

在所有这些中,您可能只想要使用.workItem,因为它会在项目完成时清理您的临时对象.其他选项可能是针对依赖于旧行为的错误代码,或者是那些实际上想要自己管理这些内容的稀有用户.


实际上,考虑一下,如果你提交的工作项只是Swift-only(他们不会调用任何Objective-C代码),那么.可能是安全和正确的.鉴于任何/所有Swift标准库类都可能调用某些Objective-C代码,您可能希望将其限制为完全位于您自己的Swift代码中的计算.

  • Apple经常习惯于记录新事物,而且他们是否会回来并做文档可能会受到影响.`UIInputView`上的`allowsSelfSizing`属性自iOS 9以来就已经存在,没有任何文档被添加到它来解释它有什么效果,并且它似乎没有任何影响,无论它设置为能够改变大小. (4认同)