美文网首页Swift 学习IOS理论知识
Swift 4.0 学习笔记 - 调度组 DispatchGro

Swift 4.0 学习笔记 - 调度组 DispatchGro

作者: xu_chen | 来源:发表于2018-08-06 19:59 被阅读362次

一、概述

我们在实际开发过程中,一个页面可能需要请求多个接口,最后等到所有接口数据都请求完成后,再执行创建 UI 的操作。这个时候就需要用到调度组了。它可以并发执行多个网络请求,不会阻塞主线程,造成卡顿现象,并且监听到啥时候请求都执行完毕。

二、在 OC 中的写法

- (void)requestDatasGroup {
    // 创建调度组
    dispatch_group_t group = dispatch_group_create();
    // 创建队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    // 模拟异步发送网络请求 A
    // 入组
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"接口 A 数据请求完成");
        // 出组
        dispatch_group_leave(group);
    });
    
    // 模拟异步发送网络请求 B
    // 入组
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"接口 B 数据请求完成");
        // 出组
        dispatch_group_leave(group);
    });
    
    NSLog(@"我是最开始执行的,异步操作里的打印是后执行的");
    
    // 调度组的任务都执行完毕
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"接口 A 和接口 B 的数据请求都已经完毕!, 开始合并两个接口的数据");
    });
}

三、在 Swift 4.0 中的写法

  /// 网络请求调度组
    private func datasRequestGroup() {
        // 创建调度组
        let workingGroup = DispatchGroup()
        // 创建多列
        let workingQueue = DispatchQueue(label: "request_queue")
        
        // 模拟异步发送网络请求 A
        // 入组
        workingGroup.enter()
        workingQueue.async {
            Thread.sleep(forTimeInterval: 1)
            print("接口 A 数据请求完成")
            // 出组
            workingGroup.leave()
        }
        
        // 模拟异步发送网络请求 B
        // 入组
        workingGroup.enter()
        workingQueue.async {
            Thread.sleep(forTimeInterval: 1)
            print("接口 B 数据请求完成")
            // 出组
            workingGroup.leave()
        }
        
        print("我是最开始执行的,异步操作里的打印后执行")
        
        // 调度组里的任务都执行完毕
        workingGroup.notify(queue: workingQueue) {
            print("接口 A 和接口 B 的数据请求都已经完毕!, 开始合并两个接口的数据")
        }
    }

四、注意事项

  1. 如果调度组 group 中没有任务,会直接执行 dispatch_group_notify 方法
  2. 入组 dispatch_group_enter 、 出组 dispatch_group_leave 必须成对出现
  3. 当入组多于出组,dispatch_group_notify 方法永远不会执行
  4. 当出组多于入组,会崩溃

相关文章

  • Swift 4.0 学习笔记 - 调度组 DispatchGro

    一、概述 我们在实际开发过程中,一个页面可能需要请求多个接口,最后等到所有接口数据都请求完成后,再执行创建 UI ...

  • swift4.0 调度组基本使用

  • Swift学习笔记①

    Swift学习笔记①Swift学习笔记①

  • Swift 4.0 学习笔记整理

    整理自己学习Swift4.0笔记一、基础1、字符串2、数组 字符串 swift中字符串下标已经不是我们熟悉的int...

  • swift4.0 学习笔记

    标签(空格分隔): 未分类 基础(相关概念) 1.元祖 元组(tuples)把多个值组合成一个复合值。元组内的值可...

  • swift4.0学习笔记

    1 swift是类型安全语言1、在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floatin...

  • Swift 4.0 学习笔记一

    最近公司没什么项目弄,Swift越来越多人用了,就自己把以前用OC写的项目用Swift语言写下,小小记录下。 一、...

  • Swift 4.0 学习笔记二

    今天我重点写一下OC中的NSString和Swift中的String不同,毕竟项目中对字符串的一些运用是不可缺少的...

  • Swift4.0学习笔记

    总是断断续续的学习一些swift知识,在实际开发中也未使用过swift来开发一款app。故将平时的学习笔记留在这里...

  • 更新项目Swift 4.0-4.2:

    谁知道我今天经历了什么~~~ Swift 4.0: Swift 4.2: Swift 4.0: Swift 4.2...

网友评论

    本文标题:Swift 4.0 学习笔记 - 调度组 DispatchGro

    本文链接:https://www.haomeiwen.com/subject/fyzgvftx.html