我們接着看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是第幾次執行
})