IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> swift 中多线程的使用- GCD -> 正文阅读

[移动开发]swift 中多线程的使用- GCD

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

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

  • 一.串行队列

  • 1.同步串行队列

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

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

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

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

  • 1.并发串行

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

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

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

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

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

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

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

let group = DispatchGroup();
let queue1 = DispatchQueue(label: "jc.test.com1", qos: .utility)
let queue2 = DispatchQueue(label: "jc.test.com2", qos: .utility)
let queue3 = DispatchQueue(label: "jc.test.com3", qos: .utility)
group.enter()
queue1.async(group: group){
group.leave()
  print("queue1.async")
}


group.enter()
queue2.async(group: group){
group.leave()
    print("queue2.async")
}


group.enter()
queue3.async(group: group){
group.leave()
    print("queue3.async")
}

group.notify(queue: DispatchQueue.main){
   print("group.notify")
}
  • 2.方案二:信号量去控制

  • DispatchSemaphore(value: 2)初始化信号量为2,用来控制并发线程的数量,相当于Operation中的maxConcurrentOperationCount
  • semaphore.wait()信号量 -1
  • semaphore.signal()信号量为+1
    oc版本写法
    swift 学习


let semaphore = DispatchSemaphore(value: 2)//创建信号量
let queue = DispatchQueue(label: "testConcurrentQueue", attributes: .concurrent)

queue.async(){
    semaphore.wait(timeout: .distantFuture)
    print("run task 1")
    sleep(1)
    print("complete task 1")
    semaphore.signal()
}

queue.async(){
    semaphore.wait(timeout: .distantFuture)
    print("run task 2")
    sleep(1)
    print("complete task 2")
    semaphore.signal()
}

queue.async(){
    semaphore.wait(timeout: .distantFuture)
    print("run task 3")
    sleep(1)
    print("complete task 3")
    semaphore.signal()
}

  • 3.方案三:栅栏函数(barrier)

swift 写法
oc 写法

//创建并行队列
let queue = DispatchQueue.init(label: "test1", qos: .default, attributes: .concurrent, autoreleaseFrequency: .workItem, target: nil)

queue.async {//任务一
    for index in 0...3 {
        print("----\(index)---")
    }
}
queue.async {//任务二
    for index in 0...3 {
        print("===\(index)===");
    }
}

queue.async(group: nil, qos: .default, flags: .barrier) {
    print("group")
}

queue.async {
    print("finish")
}

  • 六.其他使用

  • 1.手动激活队列

let queue = DispatchQueue(label: "jc.test.log", qos: .utility,
attributes: .initiallyInactive)

queue.async {
    for i in 0..<5 {
       print("来了一+\(i)")
       }
}

queue.async {
     for i in 5..<10 {
       print("来了二+\(i)")
       }
}

//需要调用activate,激活队列。
queue.activate()
  • 2.延迟操作

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

let queue = DispatchQueue(label: "jc.test.log")

let time = DispatchTimeInterval.seconds(3)

queue.asyncAfter(wallDeadline: .now() + time) {
    print("wall dead line done")
}

queue.asyncAfter(deadline: .now() + time) {
    print("dead line done")
}
  • 3.DispatchWorkItem的使用方式

看这里


?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:39:08  更:2022-03-08 22:42:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:04:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码