• iOS开发:Swift多线程GCD的使用


      除了上一篇文章说到到NSThread线程,还有一个GCD(Grand Central Dispath),是Apple新开发的一个解决多核编程的解决方案,充分的利用CPU资源,将所有的任务,放到一个任务队列进行调度。 GCD 默认提供了全局的并发队列,供整个应用使用,不需要创建。

    • 同步和异步的区别
      • dispatch_sync 同步:不具备开启线程的能力
      • dispatch_async 异步 :具备开启线程的能力
    •  任务的执行方式
      • 并发队列:多个任务同时执行,并发只能在一步函数下才执行异步“
      • 串行队列:让任务一个接一个的运行

    注意:一般在实际开发中最常用的是 dispatch_async 。

    下面介绍几种常用的队列使用

    一:最最常用的全局并发队列:

          //获取全局并发队列
            let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
            //将任务添加到队列中 并发执行
            dispatch_async(queue) { () -> Void in
                //doSomething...任务1
            }
            dispatch_async(queue) { () -> Void in
                //doSomething...任务2
            }
            dispatch_async(queue) { () -> Void in
                //doSomething...任务3
            }
            
            //暂停一个队列
            dispatch_suspend(queue)
            //继续队列
            dispatch_resume(queue)

    二:串行队列,队列中的任务不会并发执行,会一个任务执行完成后再执行另外一个任务

     //创建串行队列
            let serialQueue = dispatch_queue_create("dispatch_queue_name", nil)
            //将任务添加到队列中 一个任务执行完成后再执行另一个任务
            dispatch_async(serialQueue) { () -> Void in
                //doSomething... 任务1
            }
            dispatch_async(serialQueue) { () -> Void in
                //doSomething... 任务2
            }
            dispatch_async(serialQueue) { () -> Void in
                //doSomething... 任务3
            }

    三:GCD线程间的通信,通常用于子线程请求完数据,回到主线程更新UI

     //线程间通信
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
                // 在子线程做一些事情
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    //在主线程更新UI...
                })
            }

    四:线程延时执行

        //线程延时执行
            let second:Double = 3.0
            let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(second * Double(NSEC_PER_SEC)))
            
            //3s后回到主线程中执行任务
            dispatch_after(dtime, dispatch_get_main_queue()) { () -> Void in
                
            }
            //3s后会开启一个新的线程执行队列中的任务
            dispatch_after(dtime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
                
            }

    五:一次性代码,顾名思义,在应用生命周期内,block里代码块只会执行一次。

          var once:dispatch_once_t = 0
            dispatch_once(&once, { () -> Void in
                //在应用生命周期内只执行一次
            })
          

    六:队列组:将一些任务放进一个队列组,当所有任务执行完成后,会执行组的notify。

        /**********************************队列组******************************************/
            let group = dispatch_group_create()
            let groupQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
            dispatch_group_async(group, groupQueue){ () -> Void in
                //任务1
            }
            dispatch_group_async(group, groupQueue){ () -> Void in
                //任务2
            }
            dispatch_group_async(group, groupQueue){ () -> Void in
                //任务3
            }
            dispatch_group_notify(group, groupQueue) { () -> Void in
                // 会等任务1、任务2、任务3执行完毕后执行
            }

    完!

     

     

     

     

     

     

     

  • 相关阅读:
    windows 下搭建apache php mysql p…
    PHP VC9和VC6以及Thread Safe和Non…
    mysql数据库插入中文时出现ERROR 1…
    phpmyadmin 配置
    Linux系统安装时分区的选择【转】
    汉字 Unicode 编码范围
    Linux 程序后台运行
    添加用户username到sudo组
    nautilus
    记录一下自己的.tmux.conf,.vimrc
  • 原文地址:https://www.cnblogs.com/tonge/p/5038750.html
Copyright © 2020-2023  润新知