Swift3 GCD大全

本文是對(duì)這篇文章中GCD的使用方法的語(yǔ)法翻譯

另外推薦這篇

看完以上兩篇申尤,我保證你的GCD差不多都掌握了

  • Swift2.3與swift3.0全局隊(duì)列優(yōu)先級(jí)對(duì)應(yīng)關(guān)系(高 > 默認(rèn) > 低 > 后臺(tái))
  DISPATCH_QUEUE_PRIORITY_HIGH                   .userInitiated
  DISPATCH_QUEUE_PRIORITY_DEFAULT                .default
  DISPATCH_QUEUE_PRIORITY_LOW                    .utility
  DISPATCH_QUEUE_PRIORITY_BACKGROUND             .background

修條環(huán)城路(創(chuàng)建一個(gè)子線程)

        // Swift2.3
        let queue = dispatch_queue_create("環(huán)城路", nil)
        // 異步執(zhí)行
        dispatch_async(queue) {
           // 給碴土車走的(耗時(shí)操作) 
        }

        // Swift3.0
        DispatchQueue(label: "環(huán)城路").async {
            // 給碴土車走的(耗時(shí)操作)
        }

走城市自帶的環(huán)城(使用全局隊(duì)列)

        // Swift2.3
      //高 > 默認(rèn) > 低 > 后臺(tái)
        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    //  DISPATCH_QUEUE_PRIORITY_HIGH
    //  DISPATCH_QUEUE_PRIORITY_DEFAULT           
    //  DISPATCH_QUEUE_PRIORITY_LOW
    //  DISPATCH_QUEUE_PRIORITY_BACKGROUND
      
        let queue = dispatch_get_global_queue(priority, 0)
        // 異步執(zhí)行
        dispatch_async(queue) {
           // 給碴土車走的(耗時(shí)操作) 
        }

        // Swift3.0
      let qos: DispatchQoS.QoSClass =  .default 
      // .userInitiated > .default > .utility > .background
       
       DispatchQueue.global(qos:  qos).async {
            // 給碴土車走的(耗時(shí)操作)
        }

同步執(zhí)行串行隊(duì)列

         // Swift2.3
        let queue = dispatch_queue_create("syn.serial.queue", DISPATCH_QUEUE_SERIAL)
        for i in 0..<3 {
            dispatch_sync(queue) {
                currentThreadSleep(1)
                print("當(dāng)前執(zhí)行線程:\(getCurrentThread())")
                print("執(zhí)行\(zhòng)(i)")
            }
            print("\(i)執(zhí)行完畢")
        }
    print("所有隊(duì)列使用同步方式執(zhí)行完畢")

        // Swift3.0
       for i in 0..<3 {
            DispatchQueue(label: "syn.serial.queue").sync() {
                currentThreadSleep(1)
                print("當(dāng)前執(zhí)行線程:\(Thread.current)")
                print("執(zhí)行\(zhòng)(i.toEmoji)")
            }
            print("\(i.toEmoji)執(zhí)行完畢")
        }
屏幕快照 2016-11-29 上午10.08.22.png

同步執(zhí)行并行隊(duì)列

        // Swift2.3
    let queue = dispatch_queue_create("syn.concurrent.queue", DISPATCH_QUEUE_CONCURRENT)
        for i in 0..<3 {
            dispatch_sync(queue) {
                currentThreadSleep(1)
                print("當(dāng)前執(zhí)行線程:\(getCurrentThread())")
                print("執(zhí)行\(zhòng)(i)")
            }
          print("\(i)執(zhí)行完畢")
        }
        print("所有隊(duì)列使用同步方式執(zhí)行完畢")


        // Swift3.0
        for i in 0..<3 {
            DispatchQueue(label: "syn.concurrent.queue", attributes: .concurrent).sync() {
                currentThreadSleep(1)
                print("當(dāng)前執(zhí)行線程:\(Thread.current)")
                print("執(zhí)行\(zhòng)(i.toEmoji)")
            }
            print("\(i.toEmoji)執(zhí)行完畢")
        }
屏幕快照 2016-11-29 上午10.10.55.png

異步執(zhí)行串行隊(duì)列

  // Swift2.3
    let serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL)
    let queue = dispatch_queue_create("asyn.serial.queue", DISPATCH_QUEUE_SERIAL)
    
    for i in 0..<3 {
        dispatch_async(queue) {
            currentThreadSleep(Double(arc4random()%3))
            let currentThread = getCurrentThread()
            
            dispatch_sync(serialQueue, {              //同步鎖
                print("Sleep的線程\(currentThread)")
                print("當(dāng)前輸出內(nèi)容的線程\(getCurrentThread())")
                print("執(zhí)行\(zhòng)(i):\(queue)\n")
            })
        }
        
        print("\(i)添加完畢\n")
    }
    print("使用異步方式添加隊(duì)列")


  // Swift3.0 
   let serialQueue = DispatchQueue(label: "serialQueue")
        for i in 0..<3 {
            group.enter()
            DispatchQueue(label: "asyn.serial.queue").async(group: group) {
                self.currentThreadSleep(Double(arc4random()%3))
                let currentThread = Thread.current
                serialQueue.sync {              //同步鎖
                    group.leave()
                    print("①Sleep的線程\(currentThread)")
                    print("②當(dāng)前輸出內(nèi)容的線程\(Thread.current)")
                    print("③執(zhí)行\(zhòng)(i.toEmoji):\(queue)\n")
                }
            }
            print("\(i.toEmoji)添加完畢\n")
        }
屏幕快照 2016-11-29 上午10.21.13.png

異步執(zhí)行并行隊(duì)列

 // Swift2.3
    let serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL)
    let queue = dispatch_queue_create("asyn.concurrent.queue", DISPATCH_QUEUE_CONCURRENT)
    for i in 0..<3 {
        dispatch_async(queue) {
            currentThreadSleep(Double(arc4random()%3))
            let currentThread = getCurrentThread()
            
            dispatch_sync(serialQueue, {              //同步鎖
                print("Sleep的線程\(currentThread)")
                print("當(dāng)前輸出內(nèi)容的線程\(getCurrentThread())")
                print("執(zhí)行\(zhòng)(i):\(queue)\n")
            })
        }
        
        print("\(i)添加完畢\n")
    }
    print("使用異步方式添加隊(duì)列")

// Swift3.0 
    let serialQueue = DispatchQueue(label: "serialQueue")
        for i in 0..<3 {
            group.enter()
            DispatchQueue(label: "asyn.concurrent.queue", attributes: .concurrent).async(group: group) {
                self.currentThreadSleep(Double(arc4random()%3))
                let currentThread = Thread.current
                serialQueue.sync {              //同步鎖
                    group.leave()
                    print("①Sleep的線程\(currentThread)")
                    print("②當(dāng)前輸出內(nèi)容的線程\(Thread.current)")
                    print("③執(zhí)行\(zhòng)(i.toEmoji):\(queue)\n")
                }
            }
            print("\(i.toEmoji)添加完畢\n")
        }
        print("使用異步方式添加隊(duì)列")
屏幕快照 2016-11-29 上午10.37.35.png

延遲執(zhí)行

     // Swift2.3
    //dispatch_time用于計(jì)算相對(duì)時(shí)間,當(dāng)設(shè)備睡眠時(shí)弃甥,dispatch_time也就跟著睡眠了
    let delayTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(time * Double(NSEC_PER_SEC)))
    dispatch_after(delayTime, getGlobalQueue()) {
        print("執(zhí)行線程:\(getCurrentThread())\ndispatch_time: 延遲\(time)秒執(zhí)行\(zhòng)n")
    }
    
    //dispatch_walltime用于計(jì)算絕對(duì)時(shí)間,而dispatch_walltime是根據(jù)掛鐘來計(jì)算的時(shí)間,即使設(shè)備睡眠了,他也不會(huì)睡眠。
    let nowInterval = NSDate().timeIntervalSince1970
    var nowStruct = timespec(tv_sec: Int(nowInterval), tv_nsec: 0)
    let delayWalltime = dispatch_walltime(&nowStruct, Int64(time * Double(NSEC_PER_SEC)))
    dispatch_after(delayWalltime, getGlobalQueue()) {
        print("執(zhí)行線程:\(getCurrentThread())\ndispatch_walltime: 延遲\(time)秒執(zhí)行\(zhòng)n")
    }

    // Swift3.0 

        let semaphore = DispatchSemaphore(value: 0)
        let queue = getGlobalQueue()
        let delaySecond = DispatchTimeInterval.seconds(time)
        
        print(Date())
        let delayTime = DispatchTime.now() + delaySecond
        queue.asyncAfter(deadline: delayTime) {
            print("執(zhí)行線程:\(Thread.current)\ndispatch_time: 延遲\(time)秒執(zhí)行\(zhòng)n",Date())
            semaphore.signal()
        }
        
        //DispatchWallTime用于計(jì)算絕對(duì)時(shí)間,而DispatchWallTime是根據(jù)掛鐘來計(jì)算的時(shí)間,即使設(shè)備睡眠了苍狰,他也不會(huì)睡眠。
//        let nowInterval = Date().timeIntervalSince1970
//        let nowStruct = timespec(tv_sec: Int(nowInterval), tv_nsec: 0)
//        let delayWalltime = DispatchWallTime(timespec: nowStruct)
        let delayWalltime = DispatchWallTime.now() + delaySecond
        queue.asyncAfter(wallDeadline: delayWalltime) {
            print("執(zhí)行線程:\(Thread.current)\ndispatch_walltime: 延遲\(time)秒執(zhí)行\(zhòng)n", Date())
        }
        semaphore.wait()
屏幕快照 2016-11-29 上午10.48.21.png

設(shè)置全局隊(duì)列的優(yōu)先級(jí)

 // Swift2.3
    let queueHeight: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
    let queueDefault: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    let queueLow: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
    let queueBackground: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
   
    
    //優(yōu)先級(jí)不是絕對(duì)的烘绽,大體上會(huì)按這個(gè)優(yōu)先級(jí)來執(zhí)行淋昭。 一般都是使用默認(rèn)(default)優(yōu)先級(jí)
    dispatch_async(queueLow) {
        print("Low:\(getCurrentThread())")
    }
    
    dispatch_async(queueBackground) {
        print("Background:\(getCurrentThread())")
    }
    
    dispatch_async(queueDefault) {
        print("Default:\(getCurrentThread())")
    }
    
    dispatch_async(queueHeight) {
        print("High:\(getCurrentThread())")
    }

// Swift3.0

        let queueHeight = DispatchQueue.global(qos: .userInitiated)
        let queueDefault = DispatchQueue.global(qos: .default)
        let queueLow = DispatchQueue.global(qos: .utility)
        let queueBackground = DispatchQueue.global(qos: .background)
        
        let group = DispatchGroup()
        //優(yōu)先級(jí)不是絕對(duì)的,大體上會(huì)按這個(gè)優(yōu)先級(jí)來執(zhí)行诀姚。 一般都是使用默認(rèn)(default)優(yōu)先級(jí)
        queueLow.async(group: group) {
            
            print("Low:\(Thread.current)")
        }
        
        queueBackground.async(group: group) {
            print("Background:\(Thread.current)")
        }
        
        queueDefault.async(group: group) {
            print("Default:\(Thread.current)")
        }
        
        queueHeight.async(group: group) {
            print("High:\(Thread.current)")
        }
屏幕快照 2016-11-29 上午10.54.46.png

設(shè)置自建隊(duì)列優(yōu)先級(jí)

 // Swift2.3

    //優(yōu)先級(jí)的執(zhí)行順序也不是絕對(duì)的
    
    //給serialQueueHigh設(shè)定DISPATCH_QUEUE_PRIORITY_HIGH優(yōu)先級(jí)
    let serialQueueHigh = getSerialQueue("cn.zeluli.serial1")
    dispatch_set_target_queue(serialQueueHigh, getGlobalQueue(DISPATCH_QUEUE_PRIORITY_HIGH))
    
    let serialQueueLow = getSerialQueue("cn.zeluli.serial1")
    dispatch_set_target_queue(serialQueueLow, getGlobalQueue(DISPATCH_QUEUE_PRIORITY_LOW))
    
    
    dispatch_async(serialQueueLow) {
        print("低:\(getCurrentThread())")
    }
    
    dispatch_async(serialQueueHigh) {
        print("高:\(getCurrentThread())")
    }

// Swift3.0

        //優(yōu)先級(jí)的執(zhí)行順序也不是絕對(duì)的
        
        //給serialQueueHigh設(shè)定DISPATCH_QUEUE_PRIORITY_HIGH優(yōu)先級(jí)
        let serialQueueHigh = DispatchQueue(label: "cn.zeluli.serial1")
        DispatchQueue.global(qos: .userInitiated).setTarget(queue: serialQueueHigh)
        
        let serialQueueLow = DispatchQueue(label: "cn.zeluli.serial1")
        DispatchQueue.global(qos: .utility).setTarget(queue: serialQueueLow)
        
        serialQueueLow.async {
            print("低:\(Thread.current)")
        }
        
        serialQueueHigh.async {
            print("高:\(Thread.current)")
            self.ended()
        }
屏幕快照 2016-11-29 上午10.59.55.png

自動(dòng)執(zhí)行任務(wù)組

// Swift2.3
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
        let concurrentQueue: dispatch_queue_t = getConcurrentQueue("cn.zeluli")
        let group: dispatch_group_t = dispatch_group_create()
        
        //將group與queue進(jìn)行管理响牛,并且自動(dòng)執(zhí)行
        for i in 1...3 {
            dispatch_group_async(group, concurrentQueue) {
                currentThreadSleep(1)
                print("任務(wù)\(i)執(zhí)行完畢\n")
            }
        }
        
        //隊(duì)列組的都執(zhí)行完畢后會(huì)進(jìn)行通知
        dispatch_group_notify(group, dispatch_get_main_queue()) {
            print("所有的任務(wù)組執(zhí)行完畢!\n")
        }
        
        print("異步執(zhí)行測(cè)試赫段,不會(huì)阻塞當(dāng)前線程")
    }

// Swift3.0
        DispatchQueue.global(qos: .default).async {
            let concurrentQueue = DispatchQueue(label: "cn.zeluli", attributes: .concurrent)
            let group = DispatchGroup()
            
            //將group與queue進(jìn)行管理呀打,并且自動(dòng)執(zhí)行
            for i in 1...3 {
                concurrentQueue.async(group: group) {
                    self.currentThreadSleep(1)
                    print("任務(wù)\(i)執(zhí)行完畢\n")
                }
            }
            
            //隊(duì)列組的都執(zhí)行完畢后會(huì)進(jìn)行通知
            group.notify(queue: DispatchQueue.main) {
                self.ended()
            }
            
            print("異步執(zhí)行測(cè)試,不會(huì)阻塞當(dāng)前線程")
        }
屏幕快照 2016-11-29 上午11.06.37.png

手動(dòng)執(zhí)行任務(wù)組

// Swift2.3
    let concurrentQueue: dispatch_queue_t = dispatch_queue_create("cn.zeluli", DISPATCH_QUEUE_CONCURRENT)
    let group: dispatch_group_t = dispatch_group_create()
    
    //將group與queue進(jìn)行手動(dòng)關(guān)聯(lián)和管理糯笙,并且自動(dòng)執(zhí)行
    for i in 1...3 {
        dispatch_group_enter(group)                     //進(jìn)入隊(duì)列組
        
        dispatch_async(concurrentQueue, {
            currentThreadSleep(1)
            print("任務(wù)\(i)執(zhí)行完畢\n")
            
            dispatch_group_leave(group)                 //離開隊(duì)列組
        })
    }
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER)   //阻塞當(dāng)前線程贬丛,直到所有任務(wù)執(zhí)行完畢
    print("任務(wù)組執(zhí)行完畢")
    
    dispatch_group_notify(group, concurrentQueue) {
        print("手動(dòng)管理的隊(duì)列執(zhí)行OK")
    }

// Swift3.0
        let concurrentQueue = DispatchQueue(label: "cn.zeluli", attributes: .concurrent)
        let group = DispatchGroup()
        
        //將group與queue進(jìn)行手動(dòng)關(guān)聯(lián)和管理,并且自動(dòng)執(zhí)行
        for i in 1...3 {
            group.enter() //進(jìn)入隊(duì)列組
            concurrentQueue.async {
                self.currentThreadSleep(1)
                print("任務(wù)\(i.toEmoji)執(zhí)行完畢\n")
                group.leave()                 //離開隊(duì)列組
            }
        }
        
        _ = group.wait(timeout: .distantFuture) //阻塞當(dāng)前線程给涕,直到所有任務(wù)執(zhí)行完畢
        print("任務(wù)組執(zhí)行完畢")
        
        group.notify(queue: concurrentQueue) {
            self.ended()
        }
屏幕快照 2016-11-29 上午11.10.19.png

使用信號(hào)量添加同步鎖

// Swift2.3
func useSemaphoreLock() {
    
    let concurrentQueue = getConcurrentQueue("cn.zeluli")
    
    //創(chuàng)建信號(hào)量
    let semaphoreLock: dispatch_semaphore_t = dispatch_semaphore_create(1)
    
    var testNumber = 0
    
    for index in 1...10 {
        dispatch_async(concurrentQueue, {
            dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER) //上鎖
            
            testNumber += 1
            currentThreadSleep(Double(1))
            print(getCurrentThread())
            print("第\(index)次執(zhí)行: testNumber = \(testNumber)\n")
            
            dispatch_semaphore_signal(semaphoreLock)                      //開鎖
            
        })
    }
    
    print("異步執(zhí)行測(cè)試\n")
}

// Swift3.0
func useSemaphoreLock() {
        
        let concurrentQueue = getConcurrentQueue("cn.zeluli")
        
        //創(chuàng)建信號(hào)量
        let semaphoreLock = DispatchSemaphore(value: 1)
        
        var testNumber = 0
        
        for index in 0...9 {
            concurrentQueue.async {
                let wait = semaphoreLock.wait(timeout: .distantFuture) //上鎖
                print("wait=\(wait)")
                testNumber += 1
                self.currentThreadSleep(1)
                print(Thread.current)
                print("第\(index.toEmoji)次執(zhí)行: testNumber = \(testNumber)\n")
                
                semaphoreLock.signal()                      //開鎖
                
            }
        }
    }
屏幕快照 2017-02-17 下午4.42.35.png

使用Apply循環(huán)執(zhí)行

// Swift2.3
func useDispatchApply() {
    
    print("循環(huán)多次執(zhí)行并行隊(duì)列")
    let concurrentQueue: dispatch_queue_t = getConcurrentQueue("cn.zeluli")
    //會(huì)阻塞當(dāng)前線程, 但concurrentQueue隊(duì)列會(huì)在新的線程中執(zhí)行
    dispatch_apply(3, concurrentQueue) { (index) in
        
        currentThreadSleep(Double(index))
        print("第\(index)次執(zhí)行豺憔,\n\(getCurrentThread())\n")
    }
    
    
    
    print("\n\n循環(huán)多次執(zhí)行串行隊(duì)列")
    let serialQueue: dispatch_queue_t = getSerialQueue("cn.zeluli")
    //會(huì)阻塞當(dāng)前線程, serialQueue隊(duì)列在當(dāng)前線程中執(zhí)行
    dispatch_apply(3, serialQueue) { (index) in
        
        currentThreadSleep(Double(index))
        print("第\(index)次執(zhí)行,\n\(getCurrentThread())\n")
    }
}

// Swift3.0
/// 循環(huán)執(zhí)行
    func useDispatchApply() {
        
        print("循環(huán)多次執(zhí)行并行隊(duì)列")

        DispatchQueue.concurrentPerform(iterations: 3) { (index) in
            currentThreadSleep(Double(index))
            print("第\(index)次執(zhí)行够庙,\n\(Thread.current)\n")
        }
        ended()
   }
屏幕快照 2017-02-17 下午4.50.14.png

暫停和重啟隊(duì)列

// Swift2.3
func queueSuspendAndResume() {
    let concurrentQueue = getConcurrentQueue("cn.zeluli")
    
    dispatch_suspend(concurrentQueue)   //將隊(duì)列進(jìn)行掛起
    dispatch_async(concurrentQueue) { 
        print("任務(wù)執(zhí)行")
    }
    
    currentThreadSleep(2)
    dispatch_resume(concurrentQueue)    //將掛起的隊(duì)列進(jìn)行喚醒
}

// Swift3.0
func queueSuspendAndResume() {
        let concurrentQueue = getConcurrentQueue("cn.zeluli")
        concurrentQueue.suspend()   //將隊(duì)列進(jìn)行掛起
        concurrentQueue.async { 
            print("任務(wù)執(zhí)行, \(Thread.current)")
        }
        
        currentThreadSleep(2)
        concurrentQueue.resume()    //將掛起的隊(duì)列進(jìn)行喚醒
        ended()
    }

使用任務(wù)隔離柵欄(這個(gè)東西可以用來處理經(jīng)典的數(shù)組異步讀寫問題)

// Swift2.3
func useBarrierAsync() {
    let concurrentQueue: dispatch_queue_t = getConcurrentQueue("cn.zeluli")
    for i in 0...3 {
        dispatch_async(concurrentQueue) {
            currentThreadSleep(Double(i))
            print("第一批:\(i)\(getCurrentThread())")
        }
    }
    
    
    dispatch_barrier_async(concurrentQueue) {

        print("\n第一批執(zhí)行完畢后才會(huì)執(zhí)行第二批\n\(getCurrentThread())\n")
    }
    
    
    for i in 0...3 {
        dispatch_async(concurrentQueue) {
            currentThreadSleep(Double(i))
            print("第二批:\(i)\(getCurrentThread())")
        }
    }
    
    print("異步執(zhí)行測(cè)試\n")
}


// Swift3.0
func useBarrierAsync() {
        
        
        let concurrentQueue = getConcurrentQueue("cn.zeluli")
        for i in 0...3 {
            concurrentQueue.async {
                self.currentThreadSleep(Double(i))
                print("第一批:\(i.toEmoji)\(Thread.current)")
            }
        }
        
        let workItem = DispatchWorkItem(flags: .barrier) {
            print("\n第一批執(zhí)行完畢后才會(huì)執(zhí)行第二批\n\(Thread.current)\n")
        }
        
        concurrentQueue.async(execute: workItem)
        
        
        for i in 0...3 {
            concurrentQueue.async {
                self.currentThreadSleep(Double(i))
                print("第二批:\(i.toEmoji)\(Thread.current)")
            }
        }
        
        print("??????不會(huì)阻塞主線程??????")
    }
屏幕快照 2017-02-17 下午4.59.47.png

DispatchSource

// Swift2.3
/**
 以加法運(yùn)算的方式合并數(shù)據(jù)
 */
func useDispatchSourceAdd() {
    var sum = 0     //手動(dòng)計(jì)數(shù)的sum, 來模擬記錄merge的數(shù)據(jù)
    
    let queue = getGlobalQueue()
    
    //創(chuàng)建source
    let dispatchSource:dispatch_source_t = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, queue)
    
    dispatch_source_set_event_handler(dispatchSource) {
        print("source中所有的數(shù)相加的和等于\(dispatch_source_get_data(dispatchSource))")
        print("sum = \(sum)\n")
        sum = 0
       currentThreadSleep(0.3)
    }

    dispatch_resume(dispatchSource)
    
    for i in 1...10 {
        sum += i
        print(i)
        dispatch_source_merge_data(dispatchSource, UInt(i))
        currentThreadSleep(0.1)
    }
}


/**
 以或運(yùn)算的方式合并數(shù)據(jù)
 */
func useDispatchSourceOr() {
    
    var or = 0     //手動(dòng)計(jì)數(shù)的sum, 來記錄merge的數(shù)據(jù)
    
    let queue = getGlobalQueue()
    
    //創(chuàng)建source
    let dispatchSource:dispatch_source_t = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_OR, 0, 0, queue)
    
    dispatch_source_set_event_handler(dispatchSource) {
        print("source中所有的數(shù)相加的和等于\(dispatch_source_get_data(dispatchSource))")
        print("or = \(or)\n")
        or = 0
        currentThreadSleep(0.3)
        
    }
    
    dispatch_resume(dispatchSource)
    
    for i in 1...10 {
        or |= i
        print(i)
        dispatch_source_merge_data(dispatchSource, UInt(i))
        
        currentThreadSleep(0.1)
        
    }
    
    print("\nsum = \(or)")
}

/**
 使用dispatch_source創(chuàng)建定時(shí)器
 */
func useDispatchSourceTimer() {
    let queue: dispatch_queue_t = getGlobalQueue()
    let source: dispatch_source_t = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
   
    //設(shè)置間隔時(shí)間恭应,從當(dāng)前時(shí)間開始,允許偏差0納秒
    dispatch_source_set_timer(source, DISPATCH_TIME_NOW, UInt64(1 * NSEC_PER_SEC), 0)
    
    var timeout = 10    //倒計(jì)時(shí)時(shí)間
    
    //設(shè)置要處理的事件, 在我們上面創(chuàng)建的queue隊(duì)列中進(jìn)行執(zhí)行
    dispatch_source_set_event_handler(source) {
        print(getCurrentThread())
        if(timeout <= 0) {
            dispatch_source_cancel(source)
        } else {
            print("\(timeout)s")
            timeout -= 1
        }
    }
    
    //倒計(jì)時(shí)結(jié)束的事件
    dispatch_source_set_cancel_handler(source) { 
        print("倒計(jì)時(shí)結(jié)束")
    }
    dispatch_resume(source)
}

// Swift3.0
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'PingFang SC'; color: #4dbf56}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #526eda}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4dbf56}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff; min-height: 21.0px}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #93c96a}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #00afca}span.s1 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s4 {font-variant-ligatures: no-common-ligatures; color: #4dbf56}span.s5 {font-variant-ligatures: no-common-ligatures; color: #526eda}span.s6 {font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s7 {font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s8 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s9 {font-variant-ligatures: no-common-ligatures; color: #93c96a}span.s10 {font-variant-ligatures: no-common-ligatures; color: #00afca}span.s11 {font-variant-ligatures: no-common-ligatures; color: #e44347}span.s12 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #e44347}span.s13 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s14 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #4dbf56}

/// 以加法運(yùn)算的方式合并數(shù)據(jù)
    // http://www.tanhao.me/pieces/360.html/
    func useDispatchSourceAdd() {
        var sum = 0     //手動(dòng)計(jì)數(shù)的sum, 來模擬記錄merge的數(shù)據(jù)
        
        let queue = getGlobalQueue()
        //創(chuàng)建source
        let dispatchSource = DispatchSource.makeUserDataAddSource(queue: queue)
        
        dispatchSource.setEventHandler() {
            print("source中所有的數(shù)相加的和等于\(dispatchSource.data)")
            print("sum = \(sum)\n")
            sum = 0
            self.currentThreadSleep(0.3)
        }
        
        // DispatchQueue啟動(dòng)時(shí)默認(rèn)狀態(tài)是掛起的,創(chuàng)建完畢之后得主動(dòng)恢復(fù)耘眨,否則事件不會(huì)被傳送
        dispatchSource.resume()
        
        for i in 1...10 {
            sum += i
            print("i=\(i)")
            dispatchSource.add(data: UInt(i))
            currentThreadSleep(0.1)
        }
        ended()
    }
    
    
    /// 以或運(yùn)算的方式合并數(shù)據(jù)
    func useDispatchSourceOr() {
        
        var or = 0     //手動(dòng)計(jì)數(shù)的sum, 來記錄merge的數(shù)據(jù)
        
        let queue = getGlobalQueue()
        
        //創(chuàng)建source
        let dispatchSource = DispatchSource.makeUserDataOrSource(queue: queue)
        
        dispatchSource.setEventHandler {
            print("source中所有的數(shù)相加的和等于\(dispatchSource.data)")
            print("or = \(or)\n")
            or = 0
            self.currentThreadSleep(0.3)
        }
        
        dispatchSource.resume()
        
        for i in 1...10 {
            or |= i
            print("i=\(i)")
            dispatchSource.or(data: UInt(i))
            currentThreadSleep(0.1)
        }
        
        print("\nsum = \(or)")
    }
    
    
    /// 使用DispatchSource創(chuàng)建定時(shí)器
    func useDispatchSourceTimer() {
        let queue = getGlobalQueue()
        
        let source = DispatchSource.makeTimerSource(queue: queue)
        
        // deadline 結(jié)束時(shí)間
        // interval 時(shí)間間隔
        // leeway  時(shí)間精度
        source.scheduleRepeating(deadline: .now(), interval: 1, leeway: .nanoseconds(0))

        var timeout = 10    //倒計(jì)時(shí)時(shí)間
        
        //設(shè)置要處理的事件, 在我們上面創(chuàng)建的queue隊(duì)列中進(jìn)行執(zhí)行
        
        source.setEventHandler {
            print(Thread.current)
            if(timeout <= 0) {
                source.cancel()
            } else {
                print("\(timeout)s", Date())
                timeout -= 1
            }
        }
        //倒計(jì)時(shí)結(jié)束的事件
        source.setCancelHandler {
            print("倒計(jì)時(shí)結(jié)束")
        }
        source.resume()
    }

Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昼榛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剔难,更是在濱河造成了極大的恐慌胆屿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶宫,死亡現(xiàn)場(chǎng)離奇詭異非迹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纯趋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門憎兽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吵冒,你說我怎么就攤上這事唇兑。” “怎么了桦锄?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵扎附,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我结耀,道長(zhǎng)留夜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任图甜,我火速辦了婚禮碍粥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黑毅。我一直安慰自己嚼摩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枕面,像睡著了一般愿卒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潮秘,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天琼开,我揣著相機(jī)與錄音,去河邊找鬼枕荞。 笑死柜候,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躏精。 我是一名探鬼主播渣刷,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼矗烛!你這毒婦竟也來了辅柴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤高诺,失蹤者是張志新(化名)和其女友劉穎碌识,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虱而,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筏餐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牡拇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魁瞪。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惠呼,靈堂內(nèi)的尸體忽然破棺而出导俘,到底是詐尸還是另有隱情,我是刑警寧澤剔蹋,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布旅薄,位于F島的核電站,受9級(jí)特大地震影響泣崩,放射性物質(zhì)發(fā)生泄漏少梁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一矫付、第九天 我趴在偏房一處隱蔽的房頂上張望凯沪。 院中可真熱鬧,春花似錦买优、人聲如沸妨马。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烘跺。三九已至湘纵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間液荸,已是汗流浹背瞻佛。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工脱篙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娇钱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓绊困,卻偏偏與公主長(zhǎng)得像文搂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秤朗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容