当前位置:   article > 正文

swift 中多线程的使用- GCD_swift 多线程使用

swift 多线程使用

参考学习文献1
参考学习文献2

理解性的东西上边两篇博客,个人感觉写的还是不错的,可以去看看。本篇博客主要是对有GCDswift中用法上的一个总结。

  • 一.串行队列

  • 1.同步串行队列

默认创建是串行队列
label:队列的名称
qos:优先级
sync:同步方式

  1. let queue = DispatchQueue(label: "xibei.manong.queueName",qos: .default)
  2. queue.sync {
  3. for i in 0..<5 {
  4. print("来了一+\(i)")
  5. }
  6. }
  • 2.异步串行队列

默认创建是串行队列
label:队列的名称
qos:优先级
async:异步方式

  1. let queque1 = DispatchQueue(label: "xibei.manong.queueName",qos: .default)
  2. queque1.async {
  3. for i in 0..<5 {
  4. print("来了一+\(i)")
  5. }
  • 二.并发队列

  • 1.并发串行

默认创建是串行队列
label:队列的名称
qos:优先级
sync:同步
attributes:此处设置为concurrent(并发队列)

  1. let queue = DispatchQueue(label: "jc.test.log1", qos: .utility, attributes: .concurrent)
  2. queue.sync {
  3. for i in 0..<5 {
  4. print("来了一+\(i)")
  5. }
  6. }
  • 2.异步并发

默认创建是串行队列
label:队列的名称
qos:优先级
asnc:异步
attributes:此处设置为concurrent(并发队列)

  1. let queue = DispatchQueue(label: "jc.test.log1", qos: .utility, attributes: .concurrent)
  2. queue.asnc {
  3. for i in 0..<5 {
  4. print("来了一+\(i)")
  5. }
  6. }
  • 三.系统全局队列

  1. let globalQueue = DispatchQueue.global() // qos: .default
  2. let globalQueue = DispatchQueue.global(qos: .background) // 后台运行级别
  • 四.系统主队列

let mainQueue = DispatchQueue.main
  • 五.多任务执行完毕统一操作解决方案

  • 1.方案一:手动指定enter()leave()的方式控制任务开始与结束。

  1. let group = DispatchGroup();
  2. let queue1 = DispatchQueue(label: "jc.test.com1", qos: .utility)
  3. let queue2 = DispatchQueue(label: "jc.test.com2", qos: .utility)
  4. let queue3 = DispatchQueue(label: "jc.test.com3", qos: .utility)
  5. group.enter()
  6. queue1.async(group: group){
  7. group.leave()
  8. print("queue1.async")
  9. }
  10. group.enter()
  11. queue2.async(group: group){
  12. group.leave()
  13. print("queue2.async")
  14. }
  15. group.enter()
  16. queue3.async(group: group){
  17. group.leave()
  18. print("queue3.async")
  19. }
  20. group.notify(queue: DispatchQueue.main){
  21. print("group.notify")
  22. }
  • DispatchSemaphore(value: 2)初始化信号量为2,用来控制并发线程的数量,相当于Operation中的maxConcurrentOperationCount
  • semaphore.wait()信号量 -1
  • semaphore.signal()信号量为+1
    oc版本写法
    swift 学习

  1. let semaphore = DispatchSemaphore(value: 2)//创建信号量
  2. let queue = DispatchQueue(label: "testConcurrentQueue", attributes: .concurrent)
  3. queue.async(){
  4. semaphore.wait(timeout: .distantFuture)
  5. print("run task 1")
  6. sleep(1)
  7. print("complete task 1")
  8. semaphore.signal()
  9. }
  10. queue.async(){
  11. semaphore.wait(timeout: .distantFuture)
  12. print("run task 2")
  13. sleep(1)
  14. print("complete task 2")
  15. semaphore.signal()
  16. }
  17. queue.async(){
  18. semaphore.wait(timeout: .distantFuture)
  19. print("run task 3")
  20. sleep(1)
  21. print("complete task 3")
  22. semaphore.signal()
  23. }
  • 3.方案三:栅栏函数(barrier)

swift 写法
oc 写法

  1. //创建并行队列
  2. let queue = DispatchQueue.init(label: "test1", qos: .default, attributes: .concurrent, autoreleaseFrequency: .workItem, target: nil)
  3. queue.async {//任务一
  4. for index in 0...3 {
  5. print("----\(index)---")
  6. }
  7. }
  8. queue.async {//任务二
  9. for index in 0...3 {
  10. print("===\(index)===");
  11. }
  12. }
  13. queue.async(group: nil, qos: .default, flags: .barrier) {
  14. print("group")
  15. }
  16. queue.async {
  17. print("finish")
  18. }
  • 六.其他使用

  • 1.手动激活队列

  1. let queue = DispatchQueue(label: "jc.test.log", qos: .utility,
  2. attributes: .initiallyInactive)
  3. queue.async {
  4. for i in 0..<5 {
  5. print("来了一+\(i)")
  6. }
  7. }
  8. queue.async {
  9. for i in 5..<10 {
  10. print("来了二+\(i)")
  11. }
  12. }
  13. //需要调用activate,激活队列。
  14. queue.activate()
  • 2.延迟操作

在设置调用函数时,asyncAfter有两个及其相同的方法,不同的地方在于参数名有所不同,参照Stack Overflow的解释。
wallDeadline 和 deadline,当系统睡眠后,wallDeadline会继续,但是deadline会被挂起。例如:设置参数为60分钟,当系统睡眠50分钟,wallDeadline会在系统醒来之后10分钟执行,而deadline会在系统醒来之后60分钟执行。向原文作者致敬

  1. let queue = DispatchQueue(label: "jc.test.log")
  2. let time = DispatchTimeInterval.seconds(3)
  3. queue.asyncAfter(wallDeadline: .now() + time) {
  4. print("wall dead line done")
  5. }
  6. queue.asyncAfter(deadline: .now() + time) {
  7. print("dead line done")
  8. }
  • 3.DispatchWorkItem的使用方式

看这里


 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号