Tip-利用队列组合并网络请求的数据

927 阅读2分钟

队列组

  • 有这么一种需求
  •  首先:分别异步执行2个耗时操作
  •  其次:等2个异步操作都执行完毕后,再回到主线程执行操作
  • 如果想要高效率的实现这个需求,可以考虑用队列组
- (void)group
{
    //创建一个全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 创建一个队列组
    dispatch_group_t group = dispatch_group_create();
    // 1.任务1
    NSArray __block *uArray = nil; //第一个数据请求放到这个数组中

    dispatch_group_async(group, queue, ^{
        dispatch_group_enter(group); //这个标识很重要
        @weakify(self)
        //这个是利用rac的网络请求可以替换成自己的网络请求
        [[self.otherViewModel.giftListCommand execute:@{@"type": @(0), @"targetUid":SAFE_STR(self.userId)}] subscribeNext:^(id  _Nullable x) {
            //数组成功之后的处理
            @strongify(self)

            LPGiftListModel * listModel = x[0];

            NSArray *tempArray = [NSArray arrayWithArray:listModel.list];
            //截取数组数据的前16个
            uArray = [tempArray subarrayWithRange:NSMakeRange(0, 16)];

            NSLog(@"11111%@",uArray);
            //离开标识
            dispatch_group_leave(group);
        }];
    });
    // 2.任务二
    NSArray __block *demoArray = nil;

    dispatch_group_async(group, queue, ^{

        dispatch_group_enter(group);
        @weakify(self)
        [[self.otherViewModel.giftListCommand execute:@{@"type": @(2), @"targetUid":SAFE_STR(self.userId)}] subscribeNext:^(id  _Nullable x) {
            LPGiftListModel * listModel = x[0];
            NSArray *tempArray = [NSArray arrayWithArray:listModel.list];
            demoArray = [tempArray subarrayWithRange:NSMakeRange(0, 8)];
            NSLog(@"22222%@",demoArray);
            dispatch_group_leave(group);
        }];
    });

    // 3.将数据获取两个数组合并成一个数组
    dispatch_group_notify(group, queue, ^{
        // 回到主线程显示图片
        dispatch_async(dispatch_get_main_queue(), ^{
            // 4.将新图片显示出来
            NSMutableArray *array = [NSMutableArray arrayWithArray:uArray];
            [array addObjectsFromArray:demoArray];
            self.giftDataArr = array;
            NSLog(@"33333%@",array);
        });
    });
}
  • 注意我上方是直接忽略了error 如果有error的处理也要加上离开group的标识。

  • 每个任务都要一对enter、leave image.png

  • 这个是以前写的数据请求不是用的异步请求,所以不用加标识

- (void)group
{
    //创建一个全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 创建一个队列组
    dispatch_group_t group = dispatch_group_create();
    
    // 1.下载图片1
    dispatch_group_async(group, queue, ^{
        // 图片的网络路径
        NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
        
        // 加载图片
        NSData *data = [NSData dataWithContentsOfURL:url];
        
        // 生成图片
        self.image1 = [UIImage imageWithData:data];
    });
    
    // 2.下载图片2
    dispatch_group_async(group, queue, ^{
        // 图片的网络路径
        NSURL *url = [NSURL URLWithString:@"http://pic38.nipic.com/20140228/5571398_215900721128_2.jpg"];
        
        // 加载图片
        NSData *data = [NSData dataWithContentsOfURL:url];
        
        // 生成图片
        self.image2 = [UIImage imageWithData:data];
    });
    
    // 3.将图片1、图片2合成一张新的图片
    dispatch_group_notify(group, queue, ^{
        // 开启新的图形上下文
        UIGraphicsBeginImageContext(CGSizeMake(100, 100));
        
        // 绘制图片
        [self.image1 drawInRect:CGRectMake(0, 0, 50, 100)];
        [self.image2 drawInRect:CGRectMake(50, 0, 50, 100)];
        
        // 取得上下文中的图片
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        
        // 结束上下文
        UIGraphicsEndImageContext();
        
        // 回到主线程显示图片
        dispatch_async(dispatch_get_main_queue(), ^{
            // 4.将新图片显示出来 
            self.imageView.image = image;
        });
    });
}