美文网首页iOS开发攻城狮的集散地
异步任务顺序执行代码记录

异步任务顺序执行代码记录

作者: 再见远洋 | 来源:发表于2017-08-27 23:10 被阅读33次

本篇仅仅是异步任务顺序执行探索的代码记录,大家有需要的可以拿去测试:


/** queue */
@property(nonatomic,strong) dispatch_queue_t myqueue ;

/** mask */
@property(nonatomic,strong) NSMutableArray *mask;

- (void)viewDidLoad {
    [super viewDidLoad];
    _myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
    [self sendBatchRequest2:@""];

 NSLog(@"哈哈哈哈");
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"我试下主线程卡顿了吗");
    });
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(7 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"我试下主线程卡顿了吗2");
    });
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"我试下主线程卡顿了吗2");
    });
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(9 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"我试下主线程卡顿了吗2");
    });
}

#pragma  mark -  利用信号量来实现异步顺序执行
#pragma  mark -
- (void)sendBatchRequest2:(NSString *)str {
    dispatch_semaphore_t sema = dispatch_semaphore_create(1);
    for (int i = 0 ; i < self.mask.count; i++) {
        str = self.mask[i];
        dispatch_async(_myqueue, ^{
            dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
            [NSThread sleepForTimeInterval:2];
            NSLog(@"这是第%d个任务============字符串为:%@=====线程为%@",i,str,[NSThread currentThread]);
            dispatch_semaphore_signal(sema);
        });
    }
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(9 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.mask addObject:@"我是临时加入的"];
        NSLog(@"临时加入了元素到数组中");
    });
    NSLog(@"44444");
}

- (NSMutableArray *)mask {
    if (!_mask) {
        _mask = [NSMutableArray array];
        for (int i = 0; i < 10; i++) {
            [_mask addObject:[[NSString alloc]initWithFormat:@"%d",i] ];
        }
    }
    return _mask;
}

这里的myQueue是串行队列,如果换成全局的glob会出问题。

补充:

 dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    dispatch_group_async(_group, _myqueue, ^{
        NSDictionary *parameters = @{
                                     @"key":@"appKey",
                                     @"info":userSay,
                                     @"userid" : @"abc123"
                                     };
        
        NSString *urlString = @"http://www.tuling123.com/openapi/api";
        [[NTManager shareManager] POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            id jsonObject = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:NULL];
            NSLog(@"%@",jsonObject);
            dispatch_semaphore_signal(sema);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"%@",error);
            dispatch_semaphore_signal(sema);
        }];
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    });

相关文章

  • 异步任务顺序执行代码记录

    本篇仅仅是异步任务顺序执行探索的代码记录,大家有需要的可以拿去测试: 这里的myQueue是串行队列,如果换成全局...

  • 同步异步任务

    (1)、同步任务: 按照顺序执行,会造成代码堵塞 (2)、异步任务: 并行...

  • js的eventLoop事件循环

    js代码是按顺序从上到下执行的,先执行同步任务,然后执行异步任务,那有两个或者更多异步任务的时候先执行哪个呢?这个...

  • js 异步执行顺序

    js的执行顺序,先同步后异步异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask...

  • 异步与回调

    1. 同步 同步:一个任务执行完拿到结果之后,再执行下一步操作。即顺序执行代码。 2. 异步 异步:不等待一个任务...

  • 异步编程

    同步与异步 同步:按代码顺序依次执行 异步:先执行同步代码,完成后再执行异步代码 事件循环与消息队列:当代码执行到...

  • JavaScript的异步编程

    同步和异步 同步编程,就是计算机一行一行按照顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行。 同步编辑...

  • 头条面试题:js同步异步代码执行顺序测试

    异步笔试题,请写出下面代码的运行结果: 这道题考的知识点: js事件循环机制 同步异步执行顺序 微任务宏任务 as...

  • C#沉淀-异步编程 一

    什么是异步 任务以固定的顺序被执行叫做同步,任务不按固定顺序执行则叫做异步 关于进程与线程 启动程序时,系统会在内...

  • flutter 异步任务队列

    队列概念描述 我所讲的任务队列,是指异步的任务队列,而不是代码从上至下顺序执行后的按序执行任务.简单讲几个需求的场...

网友评论

    本文标题:异步任务顺序执行代码记录

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