swift中的gcd使用大法

swift中的GCD

之前写过一篇文章介绍object-c中的多线程,各种拼凑其实不是很深入,只能当做cookbook来用,然后本次swift是实践的一个结果,每写的一句代码都是自己的,和理解的,如果不理解会用通俗直白语言重复理解,或查阅其他资料整理后直至理解才写出来的。

GCD中OC与swift更新对照表

英文不好的可以翻译看一下翻译

dispatch 译: 分发,分派,任务分发

object-c swift 翻译解释
dispatch_ object_t DispatchObject DispatchQueue,DispatchGroup,和DispatchSource的基类含有挂起继续操作
dispatch_ queue_t DispatchQueue 队列
dispatch_ group_t DispatchGroup 队列组
dispatch_ data_t DispatchData 分发数据,只存在内存中
dispatch_ io_t DispatchIO 操作文件的一个通道(基于流和随机存储的描述符)
dispatch_ semaphore_t DispatchSemaphore 分发 信号
dispatch_ source_t DispatchSource 分发 源
dispatch_ time_t DispatchTime, DispatchWalltime 单个分派任务
C Swift
dispatch_ fd_t Int32
dispatch_ block_t () -> ()
dispatch_ queue_ attr_t DispatchQueueAttributes

看一下OC下多线程思维导图


思维导图

多线程的实现的四种方式

  • pthred
  • NSthread
  • GCD
  • NSOperation

具体介绍查看 http://www.jianshu.com/p/b91b42235285

1. GCD写法

2. 全局队列和主队列获取

3. 添加任务到队列,同步、异步

4. 暂停或继续队列

//MARK: 暂停或执行队列
func pauseorrsume() -> () {
    
//        DispatchQueue.init(label: "concurrentqueue1")
    
    //concurrent 并发线程
    //默认同步线程
//        let queue:DispatchQueue = DispatchQueue(label: "processQueueName")
    
    let queue:DispatchQueue = DispatchQueue(label: "processQueueName", attributes: .concurrent)
    
    queue.async {
        for idx in 1..<5
        {
            sleep(1)
            print("⚪GM\t A:\(idx)")
        }
    }
    
    queue.async {
        for idx in 1..<5
        {
            sleep(1)
            print("🔴GM\t B:\(idx)")
        }
    }
     let time = DispatchTime.now() + .seconds(2)
    DispatchQueue.main.asyncAfter(deadline: time) {
        queue.suspend()
        print("暂停")
    }
    
    //暂停之后加入的任务
    let time3 =  DispatchTime.now() + .seconds(6)
    DispatchQueue.main.asyncAfter(deadline: time3) {
        queue.async {
            for idx in 1..<5
            {
                sleep(1)
                print("🔵GM\t F:\(idx)")
            }
        }
    }
    
    
    let time2 =  DispatchTime.now() + .seconds(15)
    DispatchQueue.main.asyncAfter(deadline: time2) {
        queue.resume()
        print("继续")
        queue.async {
            for idx in 1..<5
            {
                sleep(1)
                print("🔶GM\t E:\(idx)")
            }
        }
        
    }
    //异步任务
    queue.async {
        for idx in 1..<5
        {
            sleep(1)
            print("🔷GM\t C:\(idx)")
        }
    }
    
    
}

5. 一次性执行(单例)

没有dispatch_once之类的代码,请使用swift方式"高级"用法,

static let shareInstance:AClass

6. 线程组,任务队列,与完成通知


func queuegroup() -> () {
    
    let workItem:DispatchWorkItem = DispatchWorkItem.init {
        for idx in 1..<10
        {
            print("🔴GM\t A:\(idx)")
            sleep(1)
        }
    }
    
    let workItem2:DispatchWorkItem = DispatchWorkItem.init {
        for idx in 1..<5
        {
            print("🔵GM\t B:\(idx)")
            sleep(1)
        }
    }
    
    let workItem3:DispatchWorkItem = DispatchWorkItem.init {
        for idx in 1..<20
        {
            print("⚪GM\t B:\(idx)")
//                usleep(500)
            sleep(1)
        }
    }
    
    let queue:DispatchQueue = DispatchQueue(label: "processQueueName", attributes: .concurrent)
    
//        let queue:DispatchQueue = DispatchQueue(label: "workitemqueue", qos: .default)
    //attributes: .concurrent,target: nil
    let group:DispatchGroup = DispatchGroup.init();
    
    
    workItem2.notify(queue: queue) {
        print("任务二完成")
    }
    
    workItem.notify(queue: queue) {
        print("任务一完成")
    }
    
    workItem3.notify(queue: queue) {
        print("任务三完成")
    }
    
    queue.async(group: group, execute: workItem)
    
    queue.async(group: group, execute: workItem2)
    
    queue.async(group: group, execute: workItem3)
    
    
    group.notify(queue: queue) {
        print("任务全部完成")
    }
    
}
    

7. 迭代

8. DispatchSemaphore信号量(临界区)

一句话解释:狭路相逢排队过

这是解决临界区的死锁解锁一种方式,换句话是可以实现死锁和解锁,总共就三个阶段,如下:

  • 设置临界区 DispatchSemaphore(value: 1)
  • 申请使用临界区(开始等待) semaphore.wait()
  • 释放临界区 semaphore.signal()
  //MARK:临界区,狭路相逢排队过
    func signalsampore() -> () {  
        let higherPriority = DispatchQueue.global(qos: .userInitiated)
        let lowerPriority = DispatchQueue.global(qos: .utility)
        
        let semaphore = DispatchSemaphore(value: 1)
        
        func asyncPrint(queue: DispatchQueue, symbol: String) {
            queue.async {
                print("\(symbol) waiting")
                semaphore.wait()  // requesting the resource
               
                //临界区开始 一次只能由一个线程执行这里
                for i in 0...10 {
                    sleep(1)
                    print(symbol, i)
                }
                 print("\(symbol) signal")
                //临界区结束
                semaphore.signal() // releasing the resource
            }
        }
        
        asyncPrint(queue: higherPriority, symbol: "🔴")
        asyncPrint(queue: lowerPriority, symbol: "🔵")
}

推荐博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容