swift3 GCD DispatchGroup && barr

2017-04-29  本文已影响0人  yurnery

Sample


import UIKit

final class ViewController: UIViewController {
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //        dispatchBarrier()
        disPatchGroup()
    }
}


fileprivate extension ViewController{
    func disPatchGroup(){
        DispatchQueue.global().async {
            let queue = DispatchQueue.global()
            let group = DispatchGroup()
            
            let groupItem = DispatchWorkItem{
                print("takeTimeTask1 finished +++++++++++++++++++++")
            }
            
            let item1 = DispatchWorkItem {[weak self] in
                self?.takeTimeTask1()
            }
            
            let item2 = DispatchWorkItem {[weak self] in
                self?.takeTimeTask2()
            }
            
            queue.async(group: group, execute: item1)
            queue.async(group: group, execute: item1)
            queue.async(group: group, execute: item2)
            queue.async(group: group, execute: item2)
            
            //            guard group all tasks are finished, then perform this method
            group.notify(queue: queue, work: groupItem)
            
        }
    }
    
    func dispatchBarrier(){
        DispatchQueue.global().async {
            //barrier, the queue must user creat, global is fail
            let queue = DispatchQueue.init(label: "barrier", qos: .userInitiated, attributes: .concurrent)
            let barrierItem = DispatchWorkItem(qos: .userInitiated, flags: .barrier) {
                print("takeTimeTask1 finished +++++++++++++++++++++++")
            }
            let item1 = DispatchWorkItem {[weak self] in
                self?.takeTimeTask1()
            }
            
            let item2 = DispatchWorkItem {[weak self] in
                self?.takeTimeTask2()
            }
            
            queue.async(execute: item1)
            queue.async(execute: item1)
            queue.async(execute: item1)
            queue.async(execute: item1)
            
            queue.async(execute: barrierItem)
            
            queue.async(execute: item2)
            queue.async(execute: item2)
            queue.async(execute: item2)
            queue.async(execute: item2)
        }
        
    }
    
    private func takeTimeTask1(){
        sleep(2)
        print("takeTimeTask1-------", Thread.current)
    }
    
    private func takeTimeTask2(){
        sleep(2)
        print("takeTimeTask2-------", Thread.current)
    }
}

上一篇 下一篇

猜你喜欢

热点阅读