DispatchWorkItemFlags.barrier

1.异步方式执行

import UIKit

class ViewController: UIViewController {

    let queue = DispatchQueue(label: "TestQueue", attributes: DispatchQueue.Attributes.concurrent)
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        
        queue.async {
            for _ in 0..<10 {
                print("A------async -- \(Thread.current)")
            }
        }
        
        queue.async {
            for _ in 0..<10 {
                print("B------async -- \(Thread.current)")
            }
        }

        在异步方式下的执行  
        queue.async(flags: .barrier) {
            for _ in 0..<10 {
                print("C------async -- \(Thread.current)")
            }
        }
        queue.async {
            for _ in 0..<10 {
                print("D------async -- \(Thread.current)")
            }
        }
        queue.async {
            for _ in 0..<10 {
                print("E------async -- \(Thread.current)")
            }
        }
        
    }
}

执行结果:

B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
A------async -- {number = 3, name = (null)}
A------async -- {number = 3, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
C------async -- {number = 4, name = (null)}
D------async -- {number = 4, name = (null)}
D------async -- {number = 4, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
E------async -- {number = 3, name = (null)}
E------async -- {number = 3, name = (null)}
image.png

2.同步方式执行

import UIKit

class ViewController: UIViewController {

    let queue = DispatchQueue(label: "TestQueue", attributes: DispatchQueue.Attributes.concurrent)
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        
        queue.async {
            for _ in 0..<10 {
                print("A------async -- \(Thread.current)")
            }
        }
        
        queue.async {
            for _ in 0..<10 {
                print("B------async -- \(Thread.current)")
            }
        }
      // 同步执行
        queue.sync(flags: .barrier) {
            for _ in 0..<10 {
                print("C------sync -- \(Thread.current)")
            }
        }
        queue.async {
            for _ in 0..<10 {
                print("D------async -- \(Thread.current)")
            }
        }
        queue.async {
            for _ in 0..<10 {
                print("E------async -- \(Thread.current)")
            }
        }
        
    }
}

执行结果


A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
A------async -- {number = 3, name = (null)}
A------async -- {number = 3, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
A------async -- {number = 3, name = (null)}
B------async -- {number = 4, name = (null)}
B------async -- {number = 4, name = (null)}
B------async -- {number = 4, name = (null)}
B------async -- {number = 4, name = (null)}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
C------sync -- {number = 1, name = main}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
E------async -- {number = 3, name = (null)}
D------async -- {number = 4, name = (null)}
D------async -- {number = 4, name = (null)}
D------async -- {number = 4, name = (null)}

image.png

You can read about them in the dispatch_block_flags_t manual:

你可能感兴趣的:(DispatchWorkItemFlags.barrier)