swift GCD常用方法(转载)

2024-04-21  本文已影响0人  缘之空_bb11

GCD的基本使用

    let serialQueue = DispatchQueue(label: "queue")//表示串行队列
    let concurrentQueue = DispatchQueue(label: "queue1", attributes: .concurrent)//表示并发队列
    
    let mainQueue = DispatchQueue.main//主队列
    let globalQueue = DispatchQueue.global()//全局并发队列

同步任务+串行队列

(没有开启新线程,串行执行任务,当前线程(主线程)中运行)

 let queue1 = DispatchQueue(label: "queue")
 print("begin")
 queue1.sync {
     print("线程1运行")
 }
 queue1.sync {
     print("线程2运行")
 }
 print("end")
 /*
  begin
  线程1运行
  线程2运行
  end
  */

同步任务+并发队列

(没有开启新线程,串行执行任务,当前线程(主线程)中运行)

   let queue2 = DispatchQueue(label: "queue1", attributes: .concurrent)
   print("begin")
   queue2.sync {
       print("线程1运行")
   }
   queue2.sync {
       print("线程2运行")
   }
   print("end")
   /*
    begin
    线程1运行
    线程2运行
    end
    */

异步任务+串行队列

(开启1条新线程,串行执行任务,开启1条新线程中运行)

    let queue3 = DispatchQueue(label: "queue")
    print("begin")
    queue3.async {
        print("线程1运行")
    }
    queue3.async {
        print("线程2运行")
    }
    print("end")
    /*
     begin
     end
     线程1运行
     线程2运行
     */

异步任务+并发队列

(开启2条新线程,并发执行任务,2条新线程中运行)

    let queue4 = DispatchQueue(label: "queue1", attributes: .concurrent)
    print("begin")
    queue4.async {
        print("线程1运行")
    }
    queue4.async {
        print("线程2运行")
    }
    print("end")
    /*
     begin
     end
     线程1运行
     线程2运行
     */

项目中用到的

    //1.延迟执行
    //DispatchTime.now() 获取当前时间
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
        //需要进行的操作
    }
    //2.异步进行耗时操作,主线程进行用户交互以及刷新UI的操作
    //开启一个全局的异步队列
    DispatchQueue.global().async {
        //耗时操作
        DispatchQueue.main.async {
            //进行UI刷新和用户交互
        }
    }
    //3.处理多数据请求,所有请求完毕进行UI更新
    //创建工作组
    let workingGroup = DispatchGroup()

    //创建队列
    let workingQueue = DispatchQueue(label: "requestData", attributes: .concurrent)

    //第一个网络请求
    workingGroup.enter()
    workingQueue.async {
        //进行数据请求1
        workingGroup.leave()
    }
    //第二个网络请求
    workingGroup.enter()
    workingQueue.async {
        //进行数据请求2
        workingGroup.leave()
    }
    //请求完毕
    workingGroup.notify(queue: .main) {
        //进行UI的更新
    }
上一篇 下一篇

猜你喜欢

热点阅读