大中央调度-Swift 3
Grand Central Dispatch或GCD是一种在我们的iOS应用程序中处理多任务的方法。 该系统的工作方式是可以将许多任务发送到调度队列,而调度队列又将在多个线程上运行,并最终由系统进行管理。
当我们尝试在其中一个应用程序中更新UI时,常常会想到GCD。 这些更新发生在主线程上,但是我们可能需要执行其他任务,并且这些任务可以在并发线程或后台线程上运行。
要添加一些上下文,队列是可以在主线程或后台线程中同步或异步运行的代码块。
使用队列时,我们可以使用Apple提供给我们的全局队列,也可以创建自己的自定义队列。 应该注意的是,全局队列应该谨慎使用,因为我们不想滥用它们。
为了更好地理解其中一些概念的含义,让我们直接进入代码并创建队列。
let queue = DispatchQueue(标签:“ queue.1”)
在这里,我们创建了一个自定义队列,并为其分配了唯一的标签。 您所说的标签完全是任意的,但最好为其命名与您的应用相关。
我们可以在这些队列上调用不同的方法,例如异步与同步。 这些关键字将告诉我们的应用程序如何执行我们的代码。
这是我们的代码在后台线程上同步运行而在主线程上运行的代码的示例。
//后台线程
queue.sync {
对于i in 0 .. <10 {
打印(“🔷”,i)
}
}
//主线程
对于20中的i。<30 {
打印(“⚪️”,我)
}
如果运行此代码,我们将看到如下所示:
//打印:🔷0🔷1🔷2🔷3🔷4 ... ⚪️20⚪️21⚪️22⚪️23⚪️24 ...
我们的程序将在主线程上运行的for循环处停止,因为它是同步的,因此它可以在队列中执行我们的代码块。
如果我们将队列更改为异步,我们的应用程序将可以在主线程上自由运行代码,并且还将同时在队列中执行代码块,因此我们得到如下信息:
//打印: 🔷0⚪️20🔷1⚪️21🔷2⚪️22🔷3⚪️23🔷4⚪️24🔷 ...
尽管主线程是应用程序中的最高优先级,但是我们也可以指定队列的重要性,并让我们的应用程序知道如何确定任务的优先级。 该规范称为服务质量 (QOS)。 QOS是一个枚举,我们可以按从最高优先级到最低优先级的顺序将以下值分配给列出的队列。
.userInteractive
.userInitiated
。默认
。效用
。背景
.unspecified
让我们尝试一下,通过更改它们的qos
比较两个队列。
let firstQueue = DispatchQueue(label:“ queue1”,qos:DispatchQoS.userInitiated)
让secondQueue = DispatchQueue(label:“ queue2”,qos:DispatchQoS.userInitiated)
firstQueue.sync {
对于i in 0 .. <10 {
打印(“🔷”,i)
}
}
secondQueue.sync {
对于20中的i。<30 {
打印(“⚪️”,我)
}
}
在这里,我们将队列设置为具有相同的优先级,因此我们的应用程序将同时运行这些任务。
//打印:⚪️20🔷0⚪️21🔷1⚪️22🔷2⚪️23🔷3⚪️24🔷4 ...
如果尝试将secondQueue
的qos
更改为.background
,则会得到与以下类似的不同结果:
//打印:🔷0🔷1🔷2🔷3🔷4 ... ⚪️20⚪️21⚪️22⚪️23⚪️24 ...
我们的firstQueue
在qos
方面排名较高,因此我们的应用将优先处理此任务,并确保它在secondQueue
之前运行。
- 为什么“模拟后台获取”导致崩溃(libsystem_kernel.dylib`mach_msg_trap),因为Xcode 8?
- 使用外观代理或self.view.tintColor设置tintColor?
- Datepickerselect错误的date
- 使用Swift在数分钟内将Siri支持添加到您的iOS应用
- Swift 2.0将1000格式化为友好的K.
- 在Game Center上validation本地用户时滞后
- 有没有人有任何关于如何使用MKOverlayPathView创buildpath的例子?
- animationUIScrollView contentInset导致跳跃口吃
- Swift使用Int32数组的大小