如何在Swift 3中创建调度队列

393 grand-central-dispatch ios swift3 xcode8 dispatch-after

在Swift 2中,我能够使用以下代码创建队列:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Run Code Online (Sandbox Code Playgroud)

但这不能在Swift 3中编译.

在Swift 3中写这个的首选方法是什么?

LC *_*C 웃 1111

创建并发队列

let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {

}  
Run Code Online (Sandbox Code Playgroud)

创建一个串行队列

let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync { 

}
Run Code Online (Sandbox Code Playgroud)

异步获取主队列

DispatchQueue.main.async {

}
Run Code Online (Sandbox Code Playgroud)

同步获取主队列

DispatchQueue.main.sync {

}
Run Code Online (Sandbox Code Playgroud)

获得一个后台线程

DispatchQueue.global(qos: .background).async {

}
Run Code Online (Sandbox Code Playgroud)

Xcode 8.2 beta 2:

获得一个后台线程

DispatchQueue.global(qos: .default).async {

}

DispatchQueue.global().async {
    // qos' default value is ´DispatchQoS.QoSClass.default`
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解如何使用这些队列.请参阅此答案

  • 在Xcode 8 beta 4中没有.serial选项,因此您必须通过省略属性中的.concurrent来创建串行队列. (15认同)
  • 实际上,在创建一个串行队列时,你可以省略`attributes:.serial`:`let serialQueue = DispatchQueue(label:"queuename")`. (3认同)

t1s*_*ser 54

Swift 3下编译.此示例包含我们需要的大部分语法.

QoS - 新的服务质量语法

weak self - 破坏保留周期

如果自己不可用,什么也不做

async global background queue - 用于网络查询

async main queue - 用于触摸UI.

当然,您需要为此添加一些错误检查...

DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in

    guard let strongSelf = self else { return }

    strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in

        if error != nil {
            print("error:\(error)")
        } else {
            DispatchQueue.main.async { () -> Void in
                activityIndicator.removeFromSuperview()
                strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 3中编码时,习惯于缩减和删除以前代码的30%:-) (6认同)
  • 不要将 `.global(qos: .background)` 用于 IO(网络请求)。改用`.global(qos: .default)` 或`.global(qos: .utility)`。 (2认同)

小智 28

编译于XCode 8,Swift 3 https://github.com/rpthomas/Jedisware

 @IBAction func tap(_ sender: AnyObject) {

    let thisEmail = "emailaddress.com"
    let thisPassword = "myPassword" 

    DispatchQueue.global(qos: .background).async {

        // Validate user input

        let result = self.validate(thisEmail, password: thisPassword)

        // Go back to the main thread to update the UI
        DispatchQueue.main.async {
            if !result
            {
                self.displayFailureAlert()
            }

        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Cos*_*min 10

由于上面已经回答了OP问题,我只想添加一些速度考虑因素:

DispatchQueue.global中为异步函数指定的优先级等级会有很大的不同.

我不建议使用.background线程优先级运行任务,尤其是在iPhone X上,其中任务似乎分配在低功耗内核上.

以下是来自计算密集型函数的一些实际数据,这些函数从XML文件读取(带缓冲)并执行数据插值:

设备名称/ .background/.utility/.default/.userInitiated/.userInteractive

  1. iPhone X:18.7s/6.3s/1.8s/1.8s/1.8s
  2. iPhone 7:4.6s/3.1s/3.0s/2.8s/2.6s
  3. iPhone 5s:7.3s/6.1s/4.0s/4.0s/3.8s

请注意,所有设备的数据集都不相同.它是iPhone X上最大的,也是iPhone 5s上最小的.


Mit*_*gam 9

快速 5 的更新

串行队列

let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
    // code to execute
}
Run Code Online (Sandbox Code Playgroud)

并发队列

let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)

concurrentQueue.async {
// code to execute
}
Run Code Online (Sandbox Code Playgroud)

来自苹果文档

参数

标签

附加到队列的字符串标签,以便在调试工具(例如仪器、示例、堆栈快照和崩溃报告)中唯一标识它。由于应用程序、库和框架都可以创建自己的调度队列,因此建议使用反向 DNS 命名样式 (com.example.myqueue)。该参数是可选的并且可以为 NULL。

服务质量

与队列关联的服务质量级别。该值决定了系统调度任务执行的优先级。有关可能值的列表,请参阅 DispatchQoS.QoSClass。

属性

与队列关联的属性。包含并发属性以创建并发执行任务的调度队列。如果省略该属性,调度队列将串行执行任务。

自动释放频率

自动释放由队列调度的块创建的对象的频率。有关可能值的列表,请参阅DispatchQueue.AutoreleaseFrequency

目标

要执行块的目标队列。如果您希望系统提供适合当前对象的队列,请指定 DISPATCH_TARGET_QUEUE_DEFAULT。


小智 6

我这样做了,如果您想刷新UI以显示新数据而没有用户注意到UITableView或UIPickerView,这一点尤其重要.

    DispatchQueue.main.async
 {
   /*Write your thread code here*/
 }
Run Code Online (Sandbox Code Playgroud)