Swift GCD详解

1.延时器

// 主线程调用
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5.0) {
    print("5 秒后输出", Thread.current.isMainThread)
}
// 5 秒后输出 true

2.异步执行回主线程写法

DispatchQueue.global().async {
    print("async do something\(Thread.current)")
    DispatchQueue.main.async {
        print("come back to main thread\(Thread.current)")
    }
}
/*
async do something<NSThread: 0x600002f7e6c0>{number = 3, name = (null)}
come back to main thread<NSThread: 0x600002f27c80>{number = 1, name = main}
*/

3. DispatchGroup(线程组)

let group = DispatchGroup()
// 第一组
group.enter()
AlamofireTools().getAlamofireData(url: "topic/list/jingxuan/1/bs02-iphone-4.6/0-500.json", success: { (json) in
    group.leave()
    print("第一组成功")
}) { (error) in
     group.leave()
    print("第一组失败")
}

// 第二组
group.enter()
AlamofireTools().getAlamofireData(url: "topic/list/jingxuan/1/bs02-iphone-4.6/0-10.json", success: { (json) in
    group.leave()
    print("第二组成功")
}) { (error) in
    group.leave()
    print("第二组失败")
}

// 结束
group.notify(queue: DispatchQueue.main) {
     print("全部执行完成")
}
/*
第二组成功
第一组成功
全部执行完成
*/

4.信号量(DispatchSemaphore)

let semaphore = DispatchSemaphore(value: 1)
let queue = DispatchQueue(label: "L?II")


// 第一组
queue.async {
     semaphore.wait()
    AlamofireTools().getAlamofireData(url: "topic/list/jingxuan/1/bs02-iphone-4.6/0-100.json", success: { (json) in
        semaphore.signal()
        print("第一组成功")
    }) { (error) in
        semaphore.signal()
        print("第一组失败")
    }
}


// 第二组
queue.async {
    semaphore.wait()
    AlamofireTools().getAlamofireData(url: "topic/list/jingxuan/1/bs02-iphone-4.6/0-100000.json", success: { (json) in
        semaphore.signal()
        print("第二组成功")
    }) { (error) in
        semaphore.signal()
        print("第二组失败")
    }
}


// 结束
queue.async {
    semaphore.wait()

    AlamofireTools().getAlamofireData(url: "topic/list/jingxuan/1/bs02-iphone-4.6/0-1.json", success: { (json) in
        semaphore.signal()
        print("全部执行完成")
    }) { (error) in
        semaphore.signal()
        print("全部执行完成")
    }
}
/*
queue.async {
    semaphore.wait()
    DispatchQueue.main.async {
        print("全部执行完成")
        semaphore.signal()
    }
}
*/
/*
第一组成功
第二组成功
全部执行完成
*/
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 原文:https://www.jianshu.com/p/2d57c72016c6[https://www.jia...
    夜雨聲煩_阅读 427评论 0 0
  • 本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。这大概是史上最详细、清晰的关于 GCD 的详细讲...
    花花世界的孤独行者阅读 526评论 0 1
  • 本文是由于笔者在阅读有关多线程的文章的时候,看到的觉得写的很好, 就此记录下. 在开发 APP 的时候很多时候可能...
    我太难了_9527阅读 400评论 0 2
  • 本文内容任务、队列的概念、创建方式任务 + 队列的6种组合的执行方式线程间如何通信dispatch_once、di...
    小秀秀耶阅读 1,043评论 0 9