例如,在Xcode 8 beta 3和Swift 3中,我能够创建一个串行DispatchQueue:
let serialQueue = DispatchQueue(label: "Concurrent Map",attributes: [.serial,.qosBackground],target: nil)
在Xcode 8 beta 5和Swift 3中:
let serialQueue = DispatchQueue(label: "Concurrent Map",qos: .background,attributes: [],autoreleaseFrequency: .inherit,target: nil)
我的问题是:
>在新的DispatchQueue.Attributes中,.serial不再是成员.这是否意味着没有.concurrent创建一个串行队列.我在Swift游乐场做的初步测试似乎证实了这一点.任何人都可以确认吗?
>我看到DispatchQueue.AutoreleaseFrequency是.inherit,.never和.workItem的一个新类型.这些是什么意思?我对GCD和autoreleasing进行了一些研究,但我对Autorelease池的概念并不十分熟悉.
In the new DispatchQueue.Attributes,.serial is no longer a member.
Does this mean that the absence of .concurrent creates a serial queue.
An initial test I did in Swift Playgrounds seems to confirm this. Can
anyone else confirm?
是.队列是串行或并发的.您创建的大多数队列将是串行的,因此如果您不想要默认行为,则只需要将它们设置为并发.
I see that DispatchQueue.AutoreleaseFrequency is a new type with
.inherit,.never,and .workItem. What do these mean? I did some
research on GCD and autoreleasing but I’m not very familiar with the
concept of autorelease pools.
之前,DispatchQueues将在未指定的时间(当线程变为非活动状态)时弹出它们的自动释放池.在实践中,这意味着您为您提交的每个调度项目创建了一个自动释放池,或者您的自动释放的对象将悬挂在一段不可预测的时间内.
非决定论并不是一件好事(特别是在一个并发库中),所以他们现在允许你指定三种行为之一:
.inherit:不确定,可能是以前的默认行为
.workItem:为每个执行的项目创建一个自动释放池
.never:GCD不管理自动释放池
在所有这些中,您可能只想使用.workItem,因为它会在项目完成时清理临时对象.其他选项大概是针对旧的行为的错误代码,或者实际上想要自己管理这些东西的那个罕见的用户.
其实呢,再考虑一下,如果你提交的是仅Swift的工作(他们没有调用任何Objective-C代码),那么可能是安全的正确.鉴于任何/所有Swift标准库类可能会调用一些Objective-C代码,您可能希望将其限制在完全在您自己的Swift代码中的计算.