///
func mainThread(){
// 開一條全局隊列異步執行任務
DispatchQueue.global().async {
/* Group的用法
* 1. notify(依賴任務), 必須和 enter/leave在同一隊列纔會執行
* 2. wait(任務等待)
* 3. enter/leave 手動管理group計數,enter和leave必須配對, 可以不需要wait()
*/
let group = DispatchGroup()
var subTask: [DispatchQueue] = [DispatchQueue]()
/* // 主線程
DispatchQueue.main.async { //通知ui刷新
print("Main 刷新 UI: Begin")
group.wait()
Thread.sleep(forTimeInterval: 1) //停止1秒
print("Main 刷新 UI: End")
} // */
//初始化8個子線程
for i in 0...7{
subTask.append(DispatchQueue(label: "subTask\(i)", attributes: .concurrent))
}
//啓動8個子線程任務
for item in subTask{
group.enter() //把該任務添加到組隊列中執行, enter和leave必須配對
item.async(group: group) {
Thread.sleep(forTimeInterval: 1) //停止1秒
print("\(Date().description) subTask.label = \(item.label)")
DispatchQueue.main.async(group: group, execute: refreshMainUI(dq: item)) // 通知主線程刷新UI
group.leave() //執行完之後從組隊列中移除
}
group.notify(queue: item){ // 對應的子線程完成後,掃尾任務
print("\(item.label) finished,do something more")
// *** 此處可添加 對應的子線程完成後的掃尾任務
sleep(10)
}
}
}
// 通知主線程刷新UI, 有需要在主線程中執行的代碼,請添加到此
func refreshMainUI(dq:DispatchQueue) -> DispatchWorkItem{
let workItem = DispatchWorkItem {
print("Refresh main UI: \(dq.label): Hello world! ")
// *** 此處可添加 UI 刷新任務
Thread.sleep(forTimeInterval: 5) //停止1秒
}
return workItem
}
}
Logs 如下:
****** Cyril Test Start ******
2019-01-16 09:35:44 +0000 Main: Execute mainThread()
****** Cyril Test End ******
Waitting all test done.
2019-01-16 09:35:44 +0000 subTask.label = subTask3
2019-01-16 09:35:44 +0000 subTask.label = subTask5
2019-01-16 09:35:44 +0000 subTask.label = subTask1
2019-01-16 09:35:44 +0000 subTask.label = subTask7
2019-01-16 09:35:44 +0000 subTask.label = subTask0
2019-01-16 09:35:44 +0000 subTask.label = subTask2
2019-01-16 09:35:44 +0000 subTask.label = subTask6
2019-01-16 09:35:44 +0000 subTask.label = subTask4
All test done.
Refresh main UI: subTask2: Hello world!
Refresh main UI: subTask3: Hello world!
Refresh main UI: subTask1: Hello world!
Refresh main UI: subTask0: Hello world!
subTask0 finished,do something more
subTask2 finished,do something more
subTask3 finished,do something more
subTask1 finished,do something more
subTask4 finished,do something more
Refresh main UI: subTask4: Hello world!
subTask5 finished,do something more
subTask6 finished,do something more
subTask7 finished,do something more
Refresh main UI: subTask5: Hello world!
Refresh main UI: subTask7: Hello world!
Refresh main UI: subTask6: Hello world!
最新代碼放在gitlab上:
https://gitlab.com/cyril_j/mutils/blob/master/Swift/mainThread.swift