美文网首页多线程iOS开发点滴想法
iOS 同一个页面,多个网络请求如何处理

iOS 同一个页面,多个网络请求如何处理

作者: 海边的遐想 | 来源:发表于2022-07-26 10:23 被阅读0次

首先需要定义一个group:
@property (nonatomic,strong)dispatch_group_t group;
其次所有的网络请求放在一个方法中方便查看

  • (void)dispatch_group_network
    {
    // 请求多个网络请求, 并监听所有网络请求都结束.
    // 创建一个组
    self.group = dispatch_group_create();
    dispatch_queue_t serialQueue = dispatch_queue_create("com.benben.zhixun", DISPATCH_QUEUE_SERIAL);
    // 网络请求 1
    {
    // 进入组
    dispatch_group_enter(self.group);
    dispatch_group_async(self.group, serialQueue, ^{
    [self getCategoryRequest];
    NSLog(@"网络请求 1 结束 %@", [NSThread currentThread]);
    });
    }

    // 网络请求 2
    {
    // 进入组
    dispatch_group_enter(self.group);
    // 假装这里有一个网络请求
    dispatch_group_async(self.group, serialQueue, ^{
    [self bannerRequest];
    NSLog(@"网络请求 2 结束 %@", [NSThread currentThread]);
    });
    }

    // 所有子线程任务全部完成, 并回到主线程
    dispatch_group_notify(self.group, dispatch_get_main_queue(), ^{
    NSLog(@"所有请求结束 %@", [NSThread currentThread]);
    // 最后更新UI,刷新数据
    [self.mainCollectionView reloadData];
    });
    }
    每一个子进程任务结束, 退出组


    image.png

平时在进行多线程处理任务时,有时候希望多个任务之间存在着一种联系,希望在所有的任务执行完后做一些总结性处理。
那么就可以将多个任务放在一个任务组中进行统一管理。dispatch提供了相应的API供我们完成这一需求。
结合到项目中,最多的使用场景是多个请求返回后,统一进行下一步的处理。在护眼模式请求护眼时间、以及百度BOS上传多张图片的时候,均使用了dispatch_group_t这一功能。

dispatch_group_t相关属性介绍

dispatch_group_async(group, queue, block);
将block任务添加到queue队列,并被group组管理

dispatch_group_enter(group);
声明dispatch_group_enter(group)下面的任务由group组管理,group组的任务数+1

dispatch_group_leave(group);
相应的任务执行完成,group组的任务数-1

dispatch_group_create();
创建一个group组

dispatch_group_wait(group1, DISPATCH_TIME_FOREVER);
当前线程暂停,等待dispatch_group_wait(group1, DISPATCH_TIME_FOREVER)上面的任务执行完成后,线程才继续执行。

dispatch_group_notify(group1, queue1,block);
监听group组中任务的完成状态,当所有的任务都执行完成后,触发block块,执行总结性处理。

相关文章

网友评论

    本文标题:iOS 同一个页面,多个网络请求如何处理

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