iOS 开发 学习iOS技术研究iOS开发

AFNetworking 3.0 队列 多任务

2016-08-20  本文已影响2017人  xiahua007

写在前面:

项目需求:订单,分多个子订单上传,所有子订单上传完毕后,发送总订单.

多张图片上传同理

但是.....AFNetworking 3.0 的队列貌似没有了.只好这么实现了.如果有人发现BUG或者其他未知的问题,欢迎指出.谢谢.

//  创建一个组

    dispatch_group_t group = dispatch_group_create();

    dispatch_queue_t q = dispatch_get_global_queue(0, 0);

创建第一个请求A

dispatch_group_async(group, q, ^{

    dispatch_group_enter(group);//很重要,不能少

    NSLog(@"队列A启动");

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]init];

    [manager GET:@"https://github.com/XibHua" parameters:nil progress:^(NSProgress *       _Nonnull downloadProgress) {

 } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"队列A结束");

        dispatch_group_leave(group);//很重要,不能少

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"队列A结束");

        dispatch_group_leave(group);//很重要,不能少

    }]

});

创建第二个请求B

dispatch_group_async(group, q, ^{

   dispatch_group_enter(group);

   NSLog(@"队列B启动");

   AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]init];

   [manager GET:@"https://github.com/XibHua" parameters:nil progress:^(NSProgress  *    _Nonnull downloadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"队列B结束");

        dispatch_group_leave(group);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"队列B结束");

        dispatch_group_leave(group);

    }];

});

创建第三个请求C

dispatch_group_async(group, q, ^{

    dispatch_group_enter(group);

    NSLog(@"队列C启动");

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]init];

    [manager GET:@"https://github.com/XibHua" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"队列C结束");

        dispatch_group_leave(group);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"队列C结束");

        dispatch_group_leave(group);

    }];

});

// 监听所有任务完成 - 等到 group 中的所有任务执行完毕后,"

由队列调度 block 中的任务异步执行!"

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        // 修改为主队列,后台批量下载,结束后,主线程统一更新UI

        NSLog(@"OK 都所有队列完毕 %@", [NSThread currentThread]);

    });

多次输出

2016-08-20 22:28:44.060 base64Image[1797:44213] 队列B启动

2016-08-20 22:28:44.060 base64Image[1797:44220] 队列A启动

2016-08-20 22:28:44.060 base64Image[1797:44230] 队列C启动

2016-08-20 22:28:45.632 base64Image[1797:44183] 队列C结束

2016-08-20 22:28:48.295 base64Image[1797:44183] 队列A结束

2016-08-20 22:28:49.417 base64Image[1797:44183] 队列B结束

2016-08-20 22:28:49.418 base64Image[1797:44183] OK 都所有队列完毕{number = 1, name = main}

输出

2016-08-20 22:45:46.539 base64Image[1862:50163] 队列B启动

2016-08-20 22:45:46.539 base64Image[1862:50156] 队列A启动

2016-08-20 22:45:46.539 base64Image[1862:50168] 队列C启动

2016-08-20 22:45:48.223 base64Image[1862:50125] 队列A结束

2016-08-20 22:45:50.322 base64Image[1862:50125] 队列C结束

2016-08-20 22:45:54.975 base64Image[1862:50125] 队列B结束

2016-08-20 22:45:54.976 base64Image[1862:50125] OK 都所有队列完毕{number = 1, name = main}


达到了项目的需求(子订单比较多,我是循环创建请求)

暂时没有发现问题.


//附赠:关闭某个请求

    NSURLSessionDataTask *task = [manager   GET:@"https://github.com/XibHua"parameters:@"入参"progress:^(NSProgress *_Nonnull downloadProgress) {

        //数据请求进度

    } success:^(NSURLSessionDataTask *_Nonnull task,id _Nullable responseObject) {

        //请求成功

    } failure:^(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error) {

        //请求失败

    }];

    //取消单个网络请求

    [task cancel];

上一篇 下一篇

猜你喜欢

热点阅读