美文网首页
OC 中异步顺序加载用法

OC 中异步顺序加载用法

作者: Nulll | 来源:发表于2017-12-29 15:25 被阅读153次

实际开发过程中,有可能会用到顺序加载异步的需求,比如先掉A接口,直到A接口调用完成,在调用B接口,以此类推C接口...

当然一两个接口这样写没问题,如果这样的接口多了,或者其他情况就不多说了。

解决办法:dispatch_semaphore

dispatch_semaphore是GCD用来同步的一种方式,与他相关的共有三个函数,分别是dispatch_semaphore_create,dispatch_semaphore_signal,dispatch_semaphore_wait。

实例:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);dispatch_async(dispatch_get_global_queue(0, 0), ^{

    [self logWithBlock:^(NSString *name) {

        NSLog(@"1%@",name);

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            dispatch_semaphore_signal(semaphore);

        });       

    }];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    [self logWithBlock:^(NSString *name) {

        NSLog(@"2%@",name);

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            dispatch_semaphore_signal(semaphore);

        });

    }];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    [self logWithBlock:^(NSString *name) {

        NSLog(@"3%@",name);

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            dispatch_semaphore_signal(semaphore);

        });

    }];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    [self logWithBlock:^(NSString *name) {

        NSLog(@"4%@",name);

        dispatch_semaphore_signal(semaphore);

    }];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"完毕");

});

输出

解释:

(1)dispatch_semaphore_create的声明为:

  dispatch_semaphore_t  dispatch_semaphore_create(long value);

  传入的参数为long,输出一个dispatch_semaphore_t类型且值为value的信号量。

  值得注意的是,这里的传入的参数value必须大于或等于0,否则dispatch_semaphore_create会返回NULL。

  (关于信号量,我就不在这里累述了,网上很多介绍这个的。我们这里主要讲一下dispatch_semaphore这三个函数的用法)。

(2)dispatch_semaphore_signal的声明为:

  long dispatch_semaphore_signal(dispatch_semaphore_t dsema)

  这个函数会使传入的信号量dsema的值加1;(至于返回值,待会儿再讲)

 (3) dispatch_semaphore_wait的声明为:

  long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);

  这个函数会使传入的信号量dsema的值减1;

  这个函数的作用是这样的,如果dsema信号量的值大于0,该函数所处线程就继续执行下面的语句,并且将信号量的值减1;

  如果desema的值为0,那么这个函数就阻塞当前线程等待timeout(注意timeout的类型为dispatch_time_t,

  不能直接传入整形或float型数),如果等待的期间desema的值被dispatch_semaphore_signal函数加1了,

  且该函数(即dispatch_semaphore_wait)所处线程获得了信号量,那么就继续向下执行并将信号量减1。

  如果等待期间没有获取到信号量或者信号量的值一直为0,那么等到timeout时,其所处线程自动执行其后语句。

相关文章

  • OC 中异步顺序加载用法

    实际开发过程中,有可能会用到顺序加载异步的需求,比如先掉A接口,直到A接口调用完成,在调用B接口,以此类推C接口....

  • Review JavaScript

    红宝书 综合 script加载js会阻塞渲染,标签中 fefer 指异步加载js,在文档load之后按顺序执行。a...

  • async 函数

    含义 基本用法 语法 async 函数的实现原理 与其他异步处理方法的比较 实例:按顺序完成异步操作 异步遍历器

  • html,css,js加载顺序

    1. 加载方式 css 异步加载(不阻塞)js 同步加载(阻塞) 2. 放置顺序 css 放置于 标签中原因:...

  • 跟诸子学游戏 unity3d中的线程

    1:异步加载场景依旧出现卡顿 :使用异步方式来加载场景,加载过程中的动画和场景还是会出现卡顿? 调用异步加载场景...

  • OC 中的block

    简介:block作为消息传递,在oc中的用处非常的广,自定义视图的回调,modal视图的回调,多线程中异步去加载数...

  • Swift语法点

    1 懒加载 懒加载与OC中的懒加载的区别:懒加载的类一旦 设置为nil 后, 懒加载就不会再次执行,与OC中不同,...

  • 浏览器入门学习

    浏览器加载机制 一、如何异步加载脚本 使用defer或async: defer:有顺序的,等文档读取和解析完成之后...

  • JavaScript 异步操作里的嵌套回调函数

    嵌套回调函数经常用在两个逻辑上具有先后顺序的异步操作场景中。 思考下面的问题:我们如何按顺序加载两个脚本? 自然的...

  • vue3.0 全局API-1

    defineAsyncComponent创建一个只有在需要时才会加载的异步组件。对于基本用法,defineAsyn...

网友评论

      本文标题:OC 中异步顺序加载用法

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