看一下打印结不雅:
globalQueue 如不雅不加旌旗灯号量,正常打印是什么样子的?如不雅不记得,请看上一篇文┞仿。iOS多线程系列之三:应用GCD实现异步下载图片。
- 好奇宝宝们有没有想过,在创建旌旗灯号量的时刻初始值设置成2或者更大年夜的数,例如50,会是什么效不雅? 本身敲敲代码尝尝喽,想想看。
4.2 多个线程之间进行义务调和
实际工作中,很多时刻我们须要在多个义务之间进行调和,每个义务都是多线程的。
打个比方,我们在后台下载音乐、专辑的封面。等着两个都做完了,才通知用户可以去听音乐了。两个义务都是多线程,我们其实并不知道什么时刻才能履行完毕。这个时刻,就可以靠旌旗灯号量,让大年夜家互相等待。
为了更简化这个过程,例子琅绫擎模仿了一个在别的一个办法中须要耗时1秒的一个操作。当完成之后,才履行后续操作。
- func semaphoreDemo() -> Void {
- let sema = DispatchSemaphore.init(value: 0)
- getListData { (result) in
- if result == true {
- sema.signal()
- }
- }
- sema.wait()
- print("我终于可以开端干活了")
- }
- private func getListData(isFinish:@escaping (Bool) -> ()) {
- DispatchQueue.global().async {
- Thread.sleep(forTimeInterval: 1)
- print("global queue has completed!")
- isFinish(true)
- }
- }
- 这个例子不是用group也可以做嘛?!是哒。也可以。
5. 义务组
既然是组,琅绫擎就肯定有很多队列啦,不然怎么能叫做“组”呐。
队列和组接洽关系有两种方法:手动、主动。
应用义务组可以完成很多场景的工作。例如多义务履行完后,同一刷新UI。把刷新UI的操作放在notify琅绫擎就好了。
5.1 主动接洽关系
肯定先大年夜主动开端了,因为平日主动最省事啊。这还用问嘛。
- @IBAction func useGroupQueue(_ sender: UIButton) {
- let group = DispatchGroup()
- //模仿轮回建立几个全局队列
- for index in 0...3 {
- //创建队列的同时,参加到义务组中
- DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
- Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
- print("义务\(index)履行完毕")
推荐阅读
沙龙晃荡 | 3月31日 京东、微博拭魅战专家与你合营商量容器技巧实践! 近日,Priceonomics网站应用Redbooth的数据,梳理统计出以前三年,40个国度所有行业的临盆和义务完成情况。结不雅显示>>>详细阅读
本文标题:Swift多线程:GCD进阶,单例、信号量、任务组
地址:http://www.17bianji.com/lsqh/40679.html
1/2 1