接上一篇:Swift3 GCD的基本用法(一) - 任务和队列、服务优先级、信号量
本文代码:https://github.com/NinoWang/MultithreadingDemo/tree/master
队列的循环、挂起、恢复
// 循环
func dispatchApply() {
DispatchQueue.global().async {
DispatchQueue.concurrentPerform(iterations: 10, execute: { (index) in
print("this is NO.\(index), thread=\(Thread.current)")
})
DispatchQueue.main.async {
print("Done")
}
}
}
// 挂起和恢复
func suspendAndResume() {
// 先挂起显示结果的任务 图片下载完成后恢复
print("开始任务")
let globalQueue = DispatchQueue(label: "ShowResult")
globalQueue.suspend()
globalQueue.async {
print("图片下载完成")
}
let concurrentQueue = DispatchQueue(label: "Concurrent", attributes: .concurrent)
concurrentQueue.async {
if let url = URL.init(string: "https://placebeard.it/800/800") {
do {
print("正在下载,请稍后...")
_ = try Data(contentsOf: url)
DispatchQueue.main.async {
globalQueue.resume()
}
} catch {
print(error)
}
}
}
}
GCD的其他方法
final class SingleTon: NSObject {
static let shared = SingleTon()
private override init() {}
func func1() {
print("单例中的 function")
}
}
注:final关键字的作用是这个类或方法不希望被继承和重写
// 只执行一次
func runOnce() {
SingleTon.shared.func1()
}
// asyncAfter DispatchTime 延时执行
func delayDispatchTime() {
print("开始执行\(NSDate())")
// asyncAfter 并不是在指定时间后执行任务处理,而是在指定时间后把任务追加到queue里面。因此会有少许延迟。注意,我们不能(直接)取消我们已经提交到 asyncAfter 里的代码。
// dispatch_time用于计算相对时间,当设备睡眠时,dispatch_time也就跟着睡眠了,
let time: DispatchTimeInterval = .seconds(3)
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + time, execute: {
print("相对延时3秒后执行\(NSDate())")
})
}
// asyncAfter DispatchWallTime 延时执行
func deplyDispatchWallTime() {
print("开始执行\(NSDate())")
let walltime = DispatchWallTime.now() + 3.0
//wallDeadline需要一个DispatchWallTime类型。创建DispatchWallTime类型,需要timespec的结构体。
DispatchQueue.global().asyncAfter(wallDeadline: walltime) {
print("绝对延时3秒后执行\(NSDate())")
}
}
// 任务组
func queueGroup() {
let globalQueue = DispatchQueue.global()
let group = DispatchGroup()
globalQueue.async(group: group, execute: {
print("执行任务1")
})
globalQueue.async(group: group, execute: {
print("执行任务2")
})
globalQueue.async(group: group, execute: {
print("执行任务3")
})
globalQueue.async(group: group, execute: {
print("执行任务4")
})
group.notify(queue: globalQueue) {
print("任务全部完成")
}
}
Swift3 GCD的基本用法(一) - 任务和队列、服务优先级、信号量