你的位置:首页 > 软件开发 > 操作系统 > 使用dispatch_group实现并封装分组并发网络请求

使用dispatch_group实现并封装分组并发网络请求

发布时间:2016-05-05 17:00:04
在实际开发中我们通常会遇到这样一种需求:某个页面加载时通过网络请求获得相应的数据,再做某些操作。有时候加载的内容需要通过好几个请求的数据组合而成,比如有两个请求A和B,我们通常为了省事,会将B请求放在A请求成功的回调中发起,在B的成功回调中将数据组合起来,这样做有明显的问题:1. ...

在实际开发中我们通常会遇到这样一种需求:某个页面加载时通过网络请求获得相应的数据,再做某些操作。有时候加载的内容需要通过好几个请求的数据组合而成,比如有两个请求A和B,我们通常为了省事,会将B请求放在A请求成功的回调中发起,在B的成功回调中将数据组合起来,这样做有明显的问题:

1.请求如果多了,需要写许多嵌套的请求

2.如果在除了最后一个请求前的某个请求失败了,就不会执行后面的请求,数据无法加载

3.请求变成同步的,这是最大的问题,在网络差的情况下,如果有n个请求,意味着用户要等待n倍于并发请求的时间才能看到内容

 

同步请求这么low的方式当然是不可接受的,所以我们要并发这些请求,在所有请求都执行完成功回调后,再做加载内容或其他操作,考虑再三,选择用GCD的dispatch_group。

dispatch_group通常有两种用法,一种是

dispatch_group_async(<#dispatch_group_t group#>, <#dispatch_queue_t queue#>, <#^(void)block#>)

创建一个dispatch_group_t, 将并发的操作放在block中,在

dispatch_group_notify(<#dispatch_group_t group#>, <#dispatch_queue_t queue#>, <#^(void)block#>)

的block中执行多组block执行完毕后的操作,对于网络请求来说,在请求发出时他就算执行完毕了,并不会等待回调,所以不满足我们的需求。

所以采用另一种用法:

使用dispatch_group_enter和dispatch_group_leave,这种方式使用更为灵活,enter和leave必须配合使用,有几次enter就要有几次leave,否则group会一直存在。当所有enter的block都leave后,会执行dispatch_group_notify的block。

我们当然可以在网络请求前enter,在执行完每个请求的成功回调后leave,再在notify中执行内容加载,这样看来问题就解决了,但还是有点小小不爽,每次发起组请求我都得创建group,写一堆的enter和leave,既麻烦也不利于复用,很自然我们想到把他封装一下,最好能做到将一个网络请求加到组里,而不用修改原先的网络请求代码,就像这样:

[[MDXuexiBaoAPI sharedInstance] postForGroup:^{    request1 success:^(id responseObject) {          } failure:^(NSError *error) {          }];        request2 success:^(id responseObject) {    } failure:^(NSError *error) {          }];  } success:^{    // group success  } failure:^(NSArray *errorArray) {    // group failure  }]

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:使用dispatch_group实现并封装分组并发网络请求

关键词:网络

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。