微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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游乐场做的初步测试似乎证实了这一点.任何人都可以确认吗?
>我看到dispatchQueue.AutoreleaseFrequency是.inherit,.never和.workItem的一个新类型.这些是什么意思?我对GCD和autoreleasing进行了一些研究,但我对Autorelease池的概念并不十分熟悉.

我找不到任何这些新属性的官方文档(可能正在进行中),但是鉴于现有的GCD文档,并且在两行之间进行阅读,很容易直观地看出这里的意图.

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代码中的计算.

原文地址:https://www.jb51.cc/swift/318748.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐