本文是對(duì)這篇文章中GCD的使用方法的語(yǔ)法翻譯
另外推薦這篇
看完以上兩篇申尤,我保證你的GCD差不多都掌握了
- Swift2.3與swift3.0全局隊(duì)列優(yōu)先級(jí)對(duì)應(yīng)關(guān)系(高 > 默認(rèn) > 低 > 后臺(tái))
DISPATCH_QUEUE_PRIORITY_HIGH .userInitiated
DISPATCH_QUEUE_PRIORITY_DEFAULT .default
DISPATCH_QUEUE_PRIORITY_LOW .utility
DISPATCH_QUEUE_PRIORITY_BACKGROUND .background
修條環(huán)城路(創(chuàng)建一個(gè)子線程)
// Swift2.3
let queue = dispatch_queue_create("環(huán)城路", nil)
// 異步執(zhí)行
dispatch_async(queue) {
// 給碴土車走的(耗時(shí)操作)
}
// Swift3.0
DispatchQueue(label: "環(huán)城路").async {
// 給碴土車走的(耗時(shí)操作)
}
走城市自帶的環(huán)城(使用全局隊(duì)列)
// Swift2.3
//高 > 默認(rèn) > 低 > 后臺(tái)
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
// DISPATCH_QUEUE_PRIORITY_HIGH
// DISPATCH_QUEUE_PRIORITY_DEFAULT
// DISPATCH_QUEUE_PRIORITY_LOW
// DISPATCH_QUEUE_PRIORITY_BACKGROUND
let queue = dispatch_get_global_queue(priority, 0)
// 異步執(zhí)行
dispatch_async(queue) {
// 給碴土車走的(耗時(shí)操作)
}
// Swift3.0
let qos: DispatchQoS.QoSClass = .default
// .userInitiated > .default > .utility > .background
DispatchQueue.global(qos: qos).async {
// 給碴土車走的(耗時(shí)操作)
}
同步執(zhí)行串行隊(duì)列
// Swift2.3
let queue = dispatch_queue_create("syn.serial.queue", DISPATCH_QUEUE_SERIAL)
for i in 0..<3 {
dispatch_sync(queue) {
currentThreadSleep(1)
print("當(dāng)前執(zhí)行線程:\(getCurrentThread())")
print("執(zhí)行\(zhòng)(i)")
}
print("\(i)執(zhí)行完畢")
}
print("所有隊(duì)列使用同步方式執(zhí)行完畢")
// Swift3.0
for i in 0..<3 {
DispatchQueue(label: "syn.serial.queue").sync() {
currentThreadSleep(1)
print("當(dāng)前執(zhí)行線程:\(Thread.current)")
print("執(zhí)行\(zhòng)(i.toEmoji)")
}
print("\(i.toEmoji)執(zhí)行完畢")
}
同步執(zhí)行并行隊(duì)列
// Swift2.3
let queue = dispatch_queue_create("syn.concurrent.queue", DISPATCH_QUEUE_CONCURRENT)
for i in 0..<3 {
dispatch_sync(queue) {
currentThreadSleep(1)
print("當(dāng)前執(zhí)行線程:\(getCurrentThread())")
print("執(zhí)行\(zhòng)(i)")
}
print("\(i)執(zhí)行完畢")
}
print("所有隊(duì)列使用同步方式執(zhí)行完畢")
// Swift3.0
for i in 0..<3 {
DispatchQueue(label: "syn.concurrent.queue", attributes: .concurrent).sync() {
currentThreadSleep(1)
print("當(dāng)前執(zhí)行線程:\(Thread.current)")
print("執(zhí)行\(zhòng)(i.toEmoji)")
}
print("\(i.toEmoji)執(zhí)行完畢")
}
異步執(zhí)行串行隊(duì)列
// Swift2.3
let serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL)
let queue = dispatch_queue_create("asyn.serial.queue", DISPATCH_QUEUE_SERIAL)
for i in 0..<3 {
dispatch_async(queue) {
currentThreadSleep(Double(arc4random()%3))
let currentThread = getCurrentThread()
dispatch_sync(serialQueue, { //同步鎖
print("Sleep的線程\(currentThread)")
print("當(dāng)前輸出內(nèi)容的線程\(getCurrentThread())")
print("執(zhí)行\(zhòng)(i):\(queue)\n")
})
}
print("\(i)添加完畢\n")
}
print("使用異步方式添加隊(duì)列")
// Swift3.0
let serialQueue = DispatchQueue(label: "serialQueue")
for i in 0..<3 {
group.enter()
DispatchQueue(label: "asyn.serial.queue").async(group: group) {
self.currentThreadSleep(Double(arc4random()%3))
let currentThread = Thread.current
serialQueue.sync { //同步鎖
group.leave()
print("①Sleep的線程\(currentThread)")
print("②當(dāng)前輸出內(nèi)容的線程\(Thread.current)")
print("③執(zhí)行\(zhòng)(i.toEmoji):\(queue)\n")
}
}
print("\(i.toEmoji)添加完畢\n")
}
異步執(zhí)行并行隊(duì)列
// Swift2.3
let serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL)
let queue = dispatch_queue_create("asyn.concurrent.queue", DISPATCH_QUEUE_CONCURRENT)
for i in 0..<3 {
dispatch_async(queue) {
currentThreadSleep(Double(arc4random()%3))
let currentThread = getCurrentThread()
dispatch_sync(serialQueue, { //同步鎖
print("Sleep的線程\(currentThread)")
print("當(dāng)前輸出內(nèi)容的線程\(getCurrentThread())")
print("執(zhí)行\(zhòng)(i):\(queue)\n")
})
}
print("\(i)添加完畢\n")
}
print("使用異步方式添加隊(duì)列")
// Swift3.0
let serialQueue = DispatchQueue(label: "serialQueue")
for i in 0..<3 {
group.enter()
DispatchQueue(label: "asyn.concurrent.queue", attributes: .concurrent).async(group: group) {
self.currentThreadSleep(Double(arc4random()%3))
let currentThread = Thread.current
serialQueue.sync { //同步鎖
group.leave()
print("①Sleep的線程\(currentThread)")
print("②當(dāng)前輸出內(nèi)容的線程\(Thread.current)")
print("③執(zhí)行\(zhòng)(i.toEmoji):\(queue)\n")
}
}
print("\(i.toEmoji)添加完畢\n")
}
print("使用異步方式添加隊(duì)列")
延遲執(zhí)行
// Swift2.3
//dispatch_time用于計(jì)算相對(duì)時(shí)間,當(dāng)設(shè)備睡眠時(shí)弃甥,dispatch_time也就跟著睡眠了
let delayTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(time * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, getGlobalQueue()) {
print("執(zhí)行線程:\(getCurrentThread())\ndispatch_time: 延遲\(time)秒執(zhí)行\(zhòng)n")
}
//dispatch_walltime用于計(jì)算絕對(duì)時(shí)間,而dispatch_walltime是根據(jù)掛鐘來計(jì)算的時(shí)間,即使設(shè)備睡眠了,他也不會(huì)睡眠。
let nowInterval = NSDate().timeIntervalSince1970
var nowStruct = timespec(tv_sec: Int(nowInterval), tv_nsec: 0)
let delayWalltime = dispatch_walltime(&nowStruct, Int64(time * Double(NSEC_PER_SEC)))
dispatch_after(delayWalltime, getGlobalQueue()) {
print("執(zhí)行線程:\(getCurrentThread())\ndispatch_walltime: 延遲\(time)秒執(zhí)行\(zhòng)n")
}
// Swift3.0
let semaphore = DispatchSemaphore(value: 0)
let queue = getGlobalQueue()
let delaySecond = DispatchTimeInterval.seconds(time)
print(Date())
let delayTime = DispatchTime.now() + delaySecond
queue.asyncAfter(deadline: delayTime) {
print("執(zhí)行線程:\(Thread.current)\ndispatch_time: 延遲\(time)秒執(zhí)行\(zhòng)n",Date())
semaphore.signal()
}
//DispatchWallTime用于計(jì)算絕對(duì)時(shí)間,而DispatchWallTime是根據(jù)掛鐘來計(jì)算的時(shí)間,即使設(shè)備睡眠了苍狰,他也不會(huì)睡眠。
// let nowInterval = Date().timeIntervalSince1970
// let nowStruct = timespec(tv_sec: Int(nowInterval), tv_nsec: 0)
// let delayWalltime = DispatchWallTime(timespec: nowStruct)
let delayWalltime = DispatchWallTime.now() + delaySecond
queue.asyncAfter(wallDeadline: delayWalltime) {
print("執(zhí)行線程:\(Thread.current)\ndispatch_walltime: 延遲\(time)秒執(zhí)行\(zhòng)n", Date())
}
semaphore.wait()
設(shè)置全局隊(duì)列的優(yōu)先級(jí)
// Swift2.3
let queueHeight: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
let queueDefault: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
let queueLow: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
let queueBackground: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
//優(yōu)先級(jí)不是絕對(duì)的烘绽,大體上會(huì)按這個(gè)優(yōu)先級(jí)來執(zhí)行淋昭。 一般都是使用默認(rèn)(default)優(yōu)先級(jí)
dispatch_async(queueLow) {
print("Low:\(getCurrentThread())")
}
dispatch_async(queueBackground) {
print("Background:\(getCurrentThread())")
}
dispatch_async(queueDefault) {
print("Default:\(getCurrentThread())")
}
dispatch_async(queueHeight) {
print("High:\(getCurrentThread())")
}
// Swift3.0
let queueHeight = DispatchQueue.global(qos: .userInitiated)
let queueDefault = DispatchQueue.global(qos: .default)
let queueLow = DispatchQueue.global(qos: .utility)
let queueBackground = DispatchQueue.global(qos: .background)
let group = DispatchGroup()
//優(yōu)先級(jí)不是絕對(duì)的,大體上會(huì)按這個(gè)優(yōu)先級(jí)來執(zhí)行诀姚。 一般都是使用默認(rèn)(default)優(yōu)先級(jí)
queueLow.async(group: group) {
print("Low:\(Thread.current)")
}
queueBackground.async(group: group) {
print("Background:\(Thread.current)")
}
queueDefault.async(group: group) {
print("Default:\(Thread.current)")
}
queueHeight.async(group: group) {
print("High:\(Thread.current)")
}
設(shè)置自建隊(duì)列優(yōu)先級(jí)
// Swift2.3
//優(yōu)先級(jí)的執(zhí)行順序也不是絕對(duì)的
//給serialQueueHigh設(shè)定DISPATCH_QUEUE_PRIORITY_HIGH優(yōu)先級(jí)
let serialQueueHigh = getSerialQueue("cn.zeluli.serial1")
dispatch_set_target_queue(serialQueueHigh, getGlobalQueue(DISPATCH_QUEUE_PRIORITY_HIGH))
let serialQueueLow = getSerialQueue("cn.zeluli.serial1")
dispatch_set_target_queue(serialQueueLow, getGlobalQueue(DISPATCH_QUEUE_PRIORITY_LOW))
dispatch_async(serialQueueLow) {
print("低:\(getCurrentThread())")
}
dispatch_async(serialQueueHigh) {
print("高:\(getCurrentThread())")
}
// Swift3.0
//優(yōu)先級(jí)的執(zhí)行順序也不是絕對(duì)的
//給serialQueueHigh設(shè)定DISPATCH_QUEUE_PRIORITY_HIGH優(yōu)先級(jí)
let serialQueueHigh = DispatchQueue(label: "cn.zeluli.serial1")
DispatchQueue.global(qos: .userInitiated).setTarget(queue: serialQueueHigh)
let serialQueueLow = DispatchQueue(label: "cn.zeluli.serial1")
DispatchQueue.global(qos: .utility).setTarget(queue: serialQueueLow)
serialQueueLow.async {
print("低:\(Thread.current)")
}
serialQueueHigh.async {
print("高:\(Thread.current)")
self.ended()
}
自動(dòng)執(zhí)行任務(wù)組
// Swift2.3
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let concurrentQueue: dispatch_queue_t = getConcurrentQueue("cn.zeluli")
let group: dispatch_group_t = dispatch_group_create()
//將group與queue進(jìn)行管理响牛,并且自動(dòng)執(zhí)行
for i in 1...3 {
dispatch_group_async(group, concurrentQueue) {
currentThreadSleep(1)
print("任務(wù)\(i)執(zhí)行完畢\n")
}
}
//隊(duì)列組的都執(zhí)行完畢后會(huì)進(jìn)行通知
dispatch_group_notify(group, dispatch_get_main_queue()) {
print("所有的任務(wù)組執(zhí)行完畢!\n")
}
print("異步執(zhí)行測(cè)試赫段,不會(huì)阻塞當(dāng)前線程")
}
// Swift3.0
DispatchQueue.global(qos: .default).async {
let concurrentQueue = DispatchQueue(label: "cn.zeluli", attributes: .concurrent)
let group = DispatchGroup()
//將group與queue進(jìn)行管理呀打,并且自動(dòng)執(zhí)行
for i in 1...3 {
concurrentQueue.async(group: group) {
self.currentThreadSleep(1)
print("任務(wù)\(i)執(zhí)行完畢\n")
}
}
//隊(duì)列組的都執(zhí)行完畢后會(huì)進(jìn)行通知
group.notify(queue: DispatchQueue.main) {
self.ended()
}
print("異步執(zhí)行測(cè)試,不會(huì)阻塞當(dāng)前線程")
}
手動(dòng)執(zhí)行任務(wù)組
// Swift2.3
let concurrentQueue: dispatch_queue_t = dispatch_queue_create("cn.zeluli", DISPATCH_QUEUE_CONCURRENT)
let group: dispatch_group_t = dispatch_group_create()
//將group與queue進(jìn)行手動(dòng)關(guān)聯(lián)和管理糯笙,并且自動(dòng)執(zhí)行
for i in 1...3 {
dispatch_group_enter(group) //進(jìn)入隊(duì)列組
dispatch_async(concurrentQueue, {
currentThreadSleep(1)
print("任務(wù)\(i)執(zhí)行完畢\n")
dispatch_group_leave(group) //離開隊(duì)列組
})
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER) //阻塞當(dāng)前線程贬丛,直到所有任務(wù)執(zhí)行完畢
print("任務(wù)組執(zhí)行完畢")
dispatch_group_notify(group, concurrentQueue) {
print("手動(dòng)管理的隊(duì)列執(zhí)行OK")
}
// Swift3.0
let concurrentQueue = DispatchQueue(label: "cn.zeluli", attributes: .concurrent)
let group = DispatchGroup()
//將group與queue進(jìn)行手動(dòng)關(guān)聯(lián)和管理,并且自動(dòng)執(zhí)行
for i in 1...3 {
group.enter() //進(jìn)入隊(duì)列組
concurrentQueue.async {
self.currentThreadSleep(1)
print("任務(wù)\(i.toEmoji)執(zhí)行完畢\n")
group.leave() //離開隊(duì)列組
}
}
_ = group.wait(timeout: .distantFuture) //阻塞當(dāng)前線程给涕,直到所有任務(wù)執(zhí)行完畢
print("任務(wù)組執(zhí)行完畢")
group.notify(queue: concurrentQueue) {
self.ended()
}
使用信號(hào)量添加同步鎖
// Swift2.3
func useSemaphoreLock() {
let concurrentQueue = getConcurrentQueue("cn.zeluli")
//創(chuàng)建信號(hào)量
let semaphoreLock: dispatch_semaphore_t = dispatch_semaphore_create(1)
var testNumber = 0
for index in 1...10 {
dispatch_async(concurrentQueue, {
dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER) //上鎖
testNumber += 1
currentThreadSleep(Double(1))
print(getCurrentThread())
print("第\(index)次執(zhí)行: testNumber = \(testNumber)\n")
dispatch_semaphore_signal(semaphoreLock) //開鎖
})
}
print("異步執(zhí)行測(cè)試\n")
}
// Swift3.0
func useSemaphoreLock() {
let concurrentQueue = getConcurrentQueue("cn.zeluli")
//創(chuàng)建信號(hào)量
let semaphoreLock = DispatchSemaphore(value: 1)
var testNumber = 0
for index in 0...9 {
concurrentQueue.async {
let wait = semaphoreLock.wait(timeout: .distantFuture) //上鎖
print("wait=\(wait)")
testNumber += 1
self.currentThreadSleep(1)
print(Thread.current)
print("第\(index.toEmoji)次執(zhí)行: testNumber = \(testNumber)\n")
semaphoreLock.signal() //開鎖
}
}
}
使用Apply循環(huán)執(zhí)行
// Swift2.3
func useDispatchApply() {
print("循環(huán)多次執(zhí)行并行隊(duì)列")
let concurrentQueue: dispatch_queue_t = getConcurrentQueue("cn.zeluli")
//會(huì)阻塞當(dāng)前線程, 但concurrentQueue隊(duì)列會(huì)在新的線程中執(zhí)行
dispatch_apply(3, concurrentQueue) { (index) in
currentThreadSleep(Double(index))
print("第\(index)次執(zhí)行豺憔,\n\(getCurrentThread())\n")
}
print("\n\n循環(huán)多次執(zhí)行串行隊(duì)列")
let serialQueue: dispatch_queue_t = getSerialQueue("cn.zeluli")
//會(huì)阻塞當(dāng)前線程, serialQueue隊(duì)列在當(dāng)前線程中執(zhí)行
dispatch_apply(3, serialQueue) { (index) in
currentThreadSleep(Double(index))
print("第\(index)次執(zhí)行,\n\(getCurrentThread())\n")
}
}
// Swift3.0
/// 循環(huán)執(zhí)行
func useDispatchApply() {
print("循環(huán)多次執(zhí)行并行隊(duì)列")
DispatchQueue.concurrentPerform(iterations: 3) { (index) in
currentThreadSleep(Double(index))
print("第\(index)次執(zhí)行够庙,\n\(Thread.current)\n")
}
ended()
}
暫停和重啟隊(duì)列
// Swift2.3
func queueSuspendAndResume() {
let concurrentQueue = getConcurrentQueue("cn.zeluli")
dispatch_suspend(concurrentQueue) //將隊(duì)列進(jìn)行掛起
dispatch_async(concurrentQueue) {
print("任務(wù)執(zhí)行")
}
currentThreadSleep(2)
dispatch_resume(concurrentQueue) //將掛起的隊(duì)列進(jìn)行喚醒
}
// Swift3.0
func queueSuspendAndResume() {
let concurrentQueue = getConcurrentQueue("cn.zeluli")
concurrentQueue.suspend() //將隊(duì)列進(jìn)行掛起
concurrentQueue.async {
print("任務(wù)執(zhí)行, \(Thread.current)")
}
currentThreadSleep(2)
concurrentQueue.resume() //將掛起的隊(duì)列進(jìn)行喚醒
ended()
}
使用任務(wù)隔離柵欄(這個(gè)東西可以用來處理經(jīng)典的數(shù)組異步讀寫問題)
// Swift2.3
func useBarrierAsync() {
let concurrentQueue: dispatch_queue_t = getConcurrentQueue("cn.zeluli")
for i in 0...3 {
dispatch_async(concurrentQueue) {
currentThreadSleep(Double(i))
print("第一批:\(i)\(getCurrentThread())")
}
}
dispatch_barrier_async(concurrentQueue) {
print("\n第一批執(zhí)行完畢后才會(huì)執(zhí)行第二批\n\(getCurrentThread())\n")
}
for i in 0...3 {
dispatch_async(concurrentQueue) {
currentThreadSleep(Double(i))
print("第二批:\(i)\(getCurrentThread())")
}
}
print("異步執(zhí)行測(cè)試\n")
}
// Swift3.0
func useBarrierAsync() {
let concurrentQueue = getConcurrentQueue("cn.zeluli")
for i in 0...3 {
concurrentQueue.async {
self.currentThreadSleep(Double(i))
print("第一批:\(i.toEmoji)\(Thread.current)")
}
}
let workItem = DispatchWorkItem(flags: .barrier) {
print("\n第一批執(zhí)行完畢后才會(huì)執(zhí)行第二批\n\(Thread.current)\n")
}
concurrentQueue.async(execute: workItem)
for i in 0...3 {
concurrentQueue.async {
self.currentThreadSleep(Double(i))
print("第二批:\(i.toEmoji)\(Thread.current)")
}
}
print("??????不會(huì)阻塞主線程??????")
}
DispatchSource
// Swift2.3
/**
以加法運(yùn)算的方式合并數(shù)據(jù)
*/
func useDispatchSourceAdd() {
var sum = 0 //手動(dòng)計(jì)數(shù)的sum, 來模擬記錄merge的數(shù)據(jù)
let queue = getGlobalQueue()
//創(chuàng)建source
let dispatchSource:dispatch_source_t = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, queue)
dispatch_source_set_event_handler(dispatchSource) {
print("source中所有的數(shù)相加的和等于\(dispatch_source_get_data(dispatchSource))")
print("sum = \(sum)\n")
sum = 0
currentThreadSleep(0.3)
}
dispatch_resume(dispatchSource)
for i in 1...10 {
sum += i
print(i)
dispatch_source_merge_data(dispatchSource, UInt(i))
currentThreadSleep(0.1)
}
}
/**
以或運(yùn)算的方式合并數(shù)據(jù)
*/
func useDispatchSourceOr() {
var or = 0 //手動(dòng)計(jì)數(shù)的sum, 來記錄merge的數(shù)據(jù)
let queue = getGlobalQueue()
//創(chuàng)建source
let dispatchSource:dispatch_source_t = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_OR, 0, 0, queue)
dispatch_source_set_event_handler(dispatchSource) {
print("source中所有的數(shù)相加的和等于\(dispatch_source_get_data(dispatchSource))")
print("or = \(or)\n")
or = 0
currentThreadSleep(0.3)
}
dispatch_resume(dispatchSource)
for i in 1...10 {
or |= i
print(i)
dispatch_source_merge_data(dispatchSource, UInt(i))
currentThreadSleep(0.1)
}
print("\nsum = \(or)")
}
/**
使用dispatch_source創(chuàng)建定時(shí)器
*/
func useDispatchSourceTimer() {
let queue: dispatch_queue_t = getGlobalQueue()
let source: dispatch_source_t = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
//設(shè)置間隔時(shí)間恭应,從當(dāng)前時(shí)間開始,允許偏差0納秒
dispatch_source_set_timer(source, DISPATCH_TIME_NOW, UInt64(1 * NSEC_PER_SEC), 0)
var timeout = 10 //倒計(jì)時(shí)時(shí)間
//設(shè)置要處理的事件, 在我們上面創(chuàng)建的queue隊(duì)列中進(jìn)行執(zhí)行
dispatch_source_set_event_handler(source) {
print(getCurrentThread())
if(timeout <= 0) {
dispatch_source_cancel(source)
} else {
print("\(timeout)s")
timeout -= 1
}
}
//倒計(jì)時(shí)結(jié)束的事件
dispatch_source_set_cancel_handler(source) {
print("倒計(jì)時(shí)結(jié)束")
}
dispatch_resume(source)
}
// Swift3.0
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'PingFang SC'; color: #4dbf56}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #526eda}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4dbf56}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff; min-height: 21.0px}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #93c96a}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #00afca}span.s1 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s4 {font-variant-ligatures: no-common-ligatures; color: #4dbf56}span.s5 {font-variant-ligatures: no-common-ligatures; color: #526eda}span.s6 {font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s7 {font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s8 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s9 {font-variant-ligatures: no-common-ligatures; color: #93c96a}span.s10 {font-variant-ligatures: no-common-ligatures; color: #00afca}span.s11 {font-variant-ligatures: no-common-ligatures; color: #e44347}span.s12 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #e44347}span.s13 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s14 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #4dbf56}
/// 以加法運(yùn)算的方式合并數(shù)據(jù)
// http://www.tanhao.me/pieces/360.html/
func useDispatchSourceAdd() {
var sum = 0 //手動(dòng)計(jì)數(shù)的sum, 來模擬記錄merge的數(shù)據(jù)
let queue = getGlobalQueue()
//創(chuàng)建source
let dispatchSource = DispatchSource.makeUserDataAddSource(queue: queue)
dispatchSource.setEventHandler() {
print("source中所有的數(shù)相加的和等于\(dispatchSource.data)")
print("sum = \(sum)\n")
sum = 0
self.currentThreadSleep(0.3)
}
// DispatchQueue啟動(dòng)時(shí)默認(rèn)狀態(tài)是掛起的,創(chuàng)建完畢之后得主動(dòng)恢復(fù)耘眨,否則事件不會(huì)被傳送
dispatchSource.resume()
for i in 1...10 {
sum += i
print("i=\(i)")
dispatchSource.add(data: UInt(i))
currentThreadSleep(0.1)
}
ended()
}
/// 以或運(yùn)算的方式合并數(shù)據(jù)
func useDispatchSourceOr() {
var or = 0 //手動(dòng)計(jì)數(shù)的sum, 來記錄merge的數(shù)據(jù)
let queue = getGlobalQueue()
//創(chuàng)建source
let dispatchSource = DispatchSource.makeUserDataOrSource(queue: queue)
dispatchSource.setEventHandler {
print("source中所有的數(shù)相加的和等于\(dispatchSource.data)")
print("or = \(or)\n")
or = 0
self.currentThreadSleep(0.3)
}
dispatchSource.resume()
for i in 1...10 {
or |= i
print("i=\(i)")
dispatchSource.or(data: UInt(i))
currentThreadSleep(0.1)
}
print("\nsum = \(or)")
}
/// 使用DispatchSource創(chuàng)建定時(shí)器
func useDispatchSourceTimer() {
let queue = getGlobalQueue()
let source = DispatchSource.makeTimerSource(queue: queue)
// deadline 結(jié)束時(shí)間
// interval 時(shí)間間隔
// leeway 時(shí)間精度
source.scheduleRepeating(deadline: .now(), interval: 1, leeway: .nanoseconds(0))
var timeout = 10 //倒計(jì)時(shí)時(shí)間
//設(shè)置要處理的事件, 在我們上面創(chuàng)建的queue隊(duì)列中進(jìn)行執(zhí)行
source.setEventHandler {
print(Thread.current)
if(timeout <= 0) {
source.cancel()
} else {
print("\(timeout)s", Date())
timeout -= 1
}
}
//倒計(jì)時(shí)結(jié)束的事件
source.setCancelHandler {
print("倒計(jì)時(shí)結(jié)束")
}
source.resume()
}