美文网首页
iOS 多线程异步请求执行同步操作

iOS 多线程异步请求执行同步操作

作者: 书上说says | 来源:发表于2019-05-02 17:45 被阅读0次

前言:

常常遇到一个页面有多个请求,这些请求当中缺存在某些依赖关系的情况,鉴于网络请求当中,大多属于异步请求,无法及时得到我们想要的数据。于是需要用到一些方法,使异步请求执行同步操作。

方法一:使用GCD串行队列
首先要搞清楚在队列当中,有串行和并行

// DISPATCH_QUEUE_CONCURRENT + async 开启多条线程
// DISPATCH_QUEUE_SERIAL + async 不开启多条线程

dispatch_queue_t queue = dispatch_queue_create("my queue", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{
        for (int i=0; i<5; i++) {
            NSLog(@"task-1---%d---%@",i,[NSThread currentThread]);
            sleep(1.0);
        }
    });
    
    dispatch_async(queue, ^{
        for (int i=0; i<5; i++) {
            NSLog(@"task-2---%d---%@",i,[NSThread currentThread]);
            sleep(1.0);
        }
    });
    
    dispatch_async(queue, ^{
        for (int i=0; i<5; i++) {
            NSLog(@"task-3---%d---%@",i,[NSThread currentThread]);
            sleep(1.0);
        }
    });

看看打印结果,执行完task-1后,依次执行task-2,再执行了task-3


1556785739282.jpg

方法二:barrier GCD

    dispatch_queue_t queue = dispatch_queue_create("my concurrent queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_suspend(queue);// 挂起
    
    dispatch_async(queue, ^{
        [self loadDataA:^(BOOL success) {
            NSLog(@" A 加载完成");
        }];
    });


    dispatch_barrier_async(queue, ^{
        NSLog(@"--this is a barrier--");
    });

    dispatch_async(queue, ^{
        [self loadDataB:^(BOOL success) {
            NSLog(@" B 加载完成");
        }];
    });

    dispatch_resume(queue);// 恢复
image.png

方法三:dispatch_group_enter + dispatch_group_leave
注意:dispatch_group_enter() 和 dispatch_group_leave() 一定是配套使用的

dispatch_group_t group = dispatch_group_create();
   dispatch_group_enter(group);
   [self loadDataA:^(BOOL success) {
       if (success) {
           NSLog(@"A load finished...");
           dispatch_group_leave(group);
       }else {
           finished(NO);
       }
   }];
   
   dispatch_group_enter(group);
   [self loadDataB:^(BOOL success) {
       if (success) {
           NSLog(@"B load finished...");
           dispatch_group_leave(group);
       }else {
           finished(NO);
       }
   }];
   
   dispatch_group_notify(group, dispatch_get_main_queue(), ^{
       finished(YES);
       NSLog(@"全部加载完成。。。%@",[NSThread currentThread]);
   });
image.png

方法四:NSOperation 设置依赖关系

   NSOperationQueue *operarionQueue = [[NSOperationQueue alloc]init];
   
   NSBlockOperation *lastOperation = [NSBlockOperation blockOperationWithBlock:^{
       sleep(1.0);
       NSLog(@"最后的任务!");
   }];
   [operarionQueue addOperation:lastOperation];
   for (int i=0; i<4; i++) {
       NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
           sleep(i);
           NSLog(@"任务%d",i+1);
       }];
       if (i==2) {
           [operation addDependency:lastOperation];
       }
       [operarionQueue addOperation:operation];
   }
image.png
if (i==2) {
         [operation addDependency:lastOperation];
}

将lastOperation依赖于operation2执行,所以只有任务2执行完成,才会执行lastOperation

本文仅个人理解,欢迎指正和补充。。。觉得有用的可以点个赞哈!

相关文章

  • iOS 多线程异步请求执行同步操作

    前言: 常常遇到一个页面有多个请求,这些请求当中缺存在某些依赖关系的情况,鉴于网络请求当中,大多属于异步请求,无法...

  • iOS 多线程基础

    转自:iOS 多线程基础 - 简书 多线程同步和异步的区别?IOS中如何实现多线程的同步? 异步:可以同时执行多条...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • 异步编程方法

    前言 同步与异步最直观的理解:等到操作执行完成才返回执行结果的是同步操作;反之,则是异步操作 传统的异步编程方法:...

  • Ajax简述

    标准请求响应时浏览器的动作(同步操作)1.1 浏览器请求什么资源,跟随显示什么资源 ajax:异步请求.2.1 局...

  • 基于Spring框架实现异步请求与异步调用

    一、异步请求 1.1 同步请求与异步请求 首先看一下同步请求的线程执行模型: 接着看一下异步请求的线程执行模型: ...

  • dispatch_group_notify 异步任务通知

    iOS异步任务,异步执行四个任务等待所有任务都完成之后执行总任务.这个可能在实际的需求中会存在多个网络请求但是需要...

  • iOS gcd看我就够了

    gcd是iOS中多线程的一种技术,下面我们来看看gcd的用法 同步&异步 同步 同步执行:字面意思,同步执行就是执...

  • GCD的使用和原理

    在我们做iOS开发的过程中,经常会与多线程打交道,异步绘制,网络请求等,方式有NSThread,NSOperati...

  • Ajax

    1. 标准请求响应时浏览器的动作(同步操作) 浏览器请求什么资源,就跟随显示什么资源 2. ajax 异步...

网友评论

      本文标题:iOS 多线程异步请求执行同步操作

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