天天看點

swift之GCD(二)

我們接着看GCD,下面我們來看GCD中的一些方法

dispatch_suspend(queue)暫停某個隊列上的操作,如果某個跟這個隊列相關的block已經開始執行,則會在這個block執行完畢之後再進行暫停

dispatch_resume(queue)恢複某個隊列上的操作

dispatch_set_target_queue(NSObject,queue)指定一個dispatch source相應的事件處理送出到哪個queue上。

讓我們看一下代碼吧

        var low = dispatch_queue_create("low", DISPATCH_QUEUE_SERIAL)

        var hight = dispatch_queue_create("hight", DISPATCH_QUEUE_CONCURRENT)

      dispatch_async(low, { () -> Void in

            println("--------1")//首先列印這個,因為已經進來,是以會把這個block執行完

            NSThread.sleepForTimeInterval(5)//在這延遲

            println("low")//第三個列印這個

            println("--------2")//第四個列印這個

        })

        NSThread.sleepForTimeInterval(3)

        dispatch_async(low, { () -> Void in//因為被暫停這個block進不來

            println("--------5")//最後列印這個block的值

            NSThread.sleepForTimeInterval(5)

            println("low")

            println("--------6")

        })

        dispatch_suspend(low)//暫停low

        dispatch_async(hight, { () -> Void in

            println("--------3")//這二個列印這個

            NSThread.sleepForTimeInterval(6)

            println("--------4")//第五個列印這個

            println("hight")//第六個列印這個

            dispatch_resume(low)//恢複low

        })

列印結果如下

--------1

--------3

low

--------2

--------4

hight

--------5

low

--------6

接下來讓我們看一下dispatch_barrier_async,等待隊列上已存在操作完成之後在進行這個隊列上的其他操作,dispatch_barrier_sync等待隊列上已存在操作完成之後在進行後面其他的操作,還是讓我們用代碼說話吧

        var queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT)

        dispatch_async(queue, { () -> Void in

            NSThread.sleepForTimeInterval(3)

            println(1)//第二個列印

        })

        dispatch_async(queue, { () -> Void in

            NSThread.sleepForTimeInterval(4)

            println(2)//第三個列印

        })

        dispatch_barrier_async(queue, { () -> Void in//在這隻會讓後面的這個隊列上的block等待,并不是讓後面所有的代碼都等待,是以會先列印4,這裡如果是dispatch_barrier_sync,4并不會先去列印,而是要等3列印之後才會去列印

            NSThread.sleepForTimeInterval(3)

            println(3)//第四個列印,因為會在這個block完之後才會執行後面的block操作

        })

        println(4)//首先列印這個值

        dispatch_async(queue, { () -> Void in

            NSThread.sleepForTimeInterval(2)

            println(5)

        })

        dispatch_async(queue, { () -> Void in

            NSThread.sleepForTimeInterval(1)

            println(6)

        })

然後看一下 dispatch_group還是直接上代碼

 var group = dispatch_group_create()//建立一個組

        var queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT)

        dispatch_group_async(group, queue) { () -> Void in

            NSThread.sleepForTimeInterval(4)

            println(3)//第三個被列印

        }

        dispatch_group_async(group, queue) { () -> Void in

            NSThread.sleepForTimeInterval(3)

            println(2)//第二個被列印

        }

        dispatch_group_async(group, queue) { () -> Void in

            NSThread.sleepForTimeInterval(2)

            println(1)//第一個被列印

        }

        dispatch_group_notify(group, queue) { () -> Void in//隻有等這個組裡的隊列執行完之後,這裡才會被列印

            println(10)

        }

        var time = dispatch_time(DISPATCH_TIME_NOW, (Int64)(10 * NSEC_PER_SEC))

        var a = dispatch_group_wait(group, time)

        println(a)//這裡是等待這個組裡的隊列執行完,但是可以設定一個逾時時間,如果在逾時時間範圍内執行完成會傳回0,如果沒有完成會傳回一個非零誤差,如果把time換成DISPATCH_TIME_FOREVER這個常量,則會一直等待下去

dispatch_once

        var onceToken :dispatch_once_t = 0//必須初始化為0,我也不知道為什麼,文檔裡是這麼說的

        dispatch_once(&onceToken, { () -> Void in

            //這裡的代碼隻會執行一次

        })

            var queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL)

             //DISPATCH_QUEUE_SERIAL block塊會按順序一次一次接着執行

             //DISPATCH_QUEUE_CONCURRENT block塊會并發執行

            dispatch_apply(5, queue, { (count:UInt) -> Void in

                println("--------")

                println(count)//count是第幾次執行

            })