iOS 多任务全部执行完后再执行操作 —— HERO博客

本文探讨了在iOS开发中如何处理多个任务,确保所有任务(如加载图片)完成后执行特定操作。首先介绍了使用子线程和队列组来避免主线程阻塞。接着讲解了通过NSOperation添加任务依赖以实现相同目标。对于异步任务,利用dispatch_group_enter和dispatch_group_leave或信号量来判断并等待所有任务完成。这些方法在多网络请求全部完成后刷新或处理多任务依赖场景下非常实用。
摘要由CSDN通过智能技术生成

介绍一下开发中遇到多个任务的情况及处理方法。

1. 有两个加载图片的任务,全部加载完成后在进行相应操作,耗时操作不应该放在主线程,所以开启子线程加载,通过队列组实现:

{
    // 创建队列组
    dispatch_group_t group =  dispatch_group_create();
    // 创建并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    // 开子线程,任务1
    dispatch_group_async(group, queue, ^{
        [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://img-blog.csdn.net/20180421152137506"]];
        NSLog(@"任务1 完成,线程:%@", [NSThread currentThread]);
    });

    // 开子线程,任务2
    dispatch_group_async(group, queue, ^{
        [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://img-blog.csdn.net/20170112145924755?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVyb193cWI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"]];
        NSLog(@"任务2 完成,线程:%@", [NSThread currentThread]);
    });

    // 全部完成
    dispatch_group_notify(group, queue, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"全部完成,线程:%@", [NSThread currentThread]);
        });
    });
}

输出结果:
2018-05-10 19:42:16.704148+0800 AsyTaskTest[5963:308229] 任务1 完成,线程:<NSThread: 0x604000263380>{number = 3, name = (null)}
2018-05-10 19:42:16.725395+0800 AsyTaskTest[5963:308228] 任务2 完成,线程:<NSThread: 0x60400007c4c0>{number = 4, name = (null)}
2018-05-10 19:42:16.725829+0800 AsyTaskTest[5963:308103] 全部完成,线程:<NSThread: 0x604000070600>{number = 1, name = main}


2. 通过NSOperation实现1中的需求,并添加依赖关系:

{
    // 创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    // 任务1
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        [NSData dataWithContentsOfURL:[NSURL URLWithString:@"
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值