Swift 3 beta 5中的DispatchQueue上的AutoreleaseFrequency
在
Xcode 8 beta 5中,DispatchQueue的初始化程序已更改为接受qos(服务质量),属性和自动释放频率的单独参数.虽然我没有将我的代码转换为新的初始化程序,但我不确定某些属性的含义,特别是autorelease频率.
例如,在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游乐场做的初步测试似乎证实了这一点.任何人都可以确认吗?
我找不到任何这些新属性的官方文档(可能正在进行中),但是鉴于现有的GCD文档,并且在两行之间进行阅读,很容易直观地看出这里的意图.
是.队列是串行或并发的.您创建的大多数队列将是串行的,因此如果您不想要默认行为,则只需要将它们设置为并发.
之前,DispatchQueues将在未指定的时间(当线程变为非活动状态)时弹出它们的自动释放池.在实践中,这意味着您为您提交的每个调度项目创建了一个自动释放池,或者您的自动释放的对象将悬挂在一段不可预测的时间内. 非决定论并不是一件好事(特别是在一个并发库中),所以他们现在允许你指定三种行为之一: .inherit:不确定,可能是以前的默认行为 .workItem:为每个执行的项目创建一个自动释放池 .never:GCD不管理自动释放池 在所有这些中,您可能只想使用.workItem,因为它会在项目完成时清理临时对象.其他选项大概是针对旧的行为的错误代码,或者实际上想要自己管理这些东西的那个罕见的用户. 其实呢,再考虑一下,如果你提交的是仅Swift的工作(他们没有调用任何Objective-C代码),那么可能是安全的正确.鉴于任何/所有Swift标准库类可能会调用一些Objective-C代码,您可能希望将其限制在完全在您自己的Swift代码中的计算. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |