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

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


/** 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);
    });

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 串行队列、并行队列、同步、异步是gcd编程中四个非常重要的概念,它们的组合会产生多种不同的执行顺序,在本文,我主要...
    wind_dy阅读 5,025评论 0 2
  • 本篇文章是对上篇文章开发多线程的一个补充。重点在于探究GCD编程中,任务的执行顺序,掌握好任务的执行顺序,我们才能...
    东了个尼阅读 6,702评论 0 5
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 7,789评论 1 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,322评论 25 709
  • 《行走在爱与恨之间》是2014年出版的,白岩松写的一本书。 起初,因为读了他的《痛并快乐着》和《白说》...
    Lisa_asil阅读 5,894评论 0 0