美文网首页
dispatch_barrier

dispatch_barrier

作者: 952625a28d0d | 来源:发表于2016-07-19 10:51 被阅读74次
    • dispatch_barrier_sync
       let serial_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_SERIAL)
            let concurrent_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_CONCURRENT)
            for index in 1...10 {
                dispatch_async(concurrent_queue, {
                    print(index)
                })
            }
            
            for index in 1...10000 {
                if index == 9999 {
                    dispatch_barrier_sync(concurrent_queue, { 
                      print("barrier执行完毕")
                    })
                }
            }
            
            print("Running on main thread")
            
            for index in 10...20 {
                dispatch_async(concurrent_queue, {
                    print(index)
                })
            }```
    
    ![Paste_Image.png](https://img.haomeiwen.com/i189984/fe94821c26da6bb5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    - 根据打印结果得出
    dispatch_barrier_sync在代码中充当了栏栅的作用,在它之后的代码必须等到之前的执行完毕才会执行,而且会阻塞主线程
    
    - dispatch_barrier_async
    
    ```swift
    let serial_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_SERIAL)
            let concurrent_queue: dispatch_queue_t! = dispatch_queue_create("www.baidu.com", DISPATCH_QUEUE_CONCURRENT)
            for index in 1...10 {
                dispatch_async(concurrent_queue, {
                    print(index)
                })
            }
            
            for index in 1...10000 {
                if index == 9999 {
                    dispatch_barrier_async(concurrent_queue, {
                      print("barrier执行完毕")
                    })
                }
            }
            
            print("Running on main thread")
            
            for index in 10...20 {
                dispatch_async(concurrent_queue, {
                    print(index)
                })
            }```
    
    ![Paste_Image.png](https://img.haomeiwen.com/i189984/55f8ae75e45f8c1c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    - 根据以上得出结论
    dispatch_barrier_async在代码中也充当了栏栅的作用,阻挡子线程代码的先后顺序,但是并不会阻塞主线程。
    
    之所以使用并行队列来举例,是因为在某种情况下,并行队列中的一些事情需要在另一些事情执行完毕之后再去执行,而串行队列本身就是按照顺序执行的,使用barrier来阻塞就没有意义了。
    
    barrier只能写在同一队列中,如果你在其中一个队列中插入了barrier,则不能指望它在另一个队列中生效,对吧。所以不能在global queue中使用,因为你每用一次global queue系统则会给你分配不同的并行队列,你在其中一个插入barrier,又有什么意义呢?所以barrier只能在自己创建的并行队列中使用,并且是同一个队列。

    相关文章

      网友评论

          本文标题:dispatch_barrier

          本文链接:https://www.haomeiwen.com/subject/gxymjttx.html