Swift3.0 GCD多线程示例

3 篇文章 0 订阅
///
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值