swift OC iOS使用Group请求多个线程网络数据,完成后再刷新数据
Dispatch Group 是GCD的一项特性,能够把任务分组。调用者可以等待这组任务执行完毕,也可以在提供回调函数之后继续往下执行,这组任务完成之后,调用者会受到通知。
func get(){
let queue = DispatchQueue.init(label: "getCount")//定义队列
let group = DispatchGroup()//创建一个组
//将队列放进组里
queue.async(group: group, execute: {
group.enter()//开始线程1
let parameters:[String: String] = [
"user_uuid": self.user_uuid
]
//网络请求1
NetWorkManager<UserVideoInfo>.requestPost(URLManagerShared.videoUserHeaderInfo, parameters: parameters) { (result) in
self.hideProgress()
switch result {
case .success(let json):
group.leave()//线程1结束
break
case .failure(let error):
self.showAlert(error.localizedDescription)
break
}
}
})
queue.async(group: group, execute: {
group.enter()//开始线程2
let parameters:[String: String] = [
"user_uuid": self.user_uuid,
"page":"\(self.m_page)"
]
//网络请求2
NetWorkManager<VideoList>.requestPost(URLManagerShared.videoUserList, parameters: parameters) { (result) in
self.hideProgress()
switch result {
case .success(let json):
group.leave()//线程2结束
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}else {
}
break
case .failure(let error):
self.showAlert(error.localizedDescription)
break
}
}
})
group.notify(queue: queue){
//队列中线程全部结束
// print("end")
//请求全部完成之后执行的操作 可在主线程刷新ui 可进行别的操作
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
}
#OC
```objectivec
//1、不开启子线程的线程组简化方式
dispatch_group_t group = dispatch_group_create();
//模拟网络请求1
dispatch_group_enter(group);
//实际运用时,用网络请求的方法代替下面的内容,不要忘记leave 异步
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 5; i++) {
[NSThread sleepForTimeInterval:1];
NSLog(@"当前线程:%@,是否是主线程:%@...1111···%d",[NSThread currentThread],[NSThread isMainThread]?@"是":@"否",i);//当前线程:<NSThread: 0x60000027ef40>{number = 3, name = (null)},是否是主线程:否...1111···0
}
dispatch_group_leave(group);
});
NSLog(@"当前线程:%@,是否是主线程:%@...4444···",[NSThread currentThread],[NSThread isMainThread]?@"是":@"否");//当前线程:<NSThread: 0x604000071d40>{number = 1, name = main},是否是主线程:是...4444···
//模拟网络请求2
dispatch_group_enter(group);
//实际运用时,用网络请求的方法代替下面的内容,不要忘记leave 异步
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 5; i++) {
[NSThread sleepForTimeInterval:1];
NSLog(@"当前线程:%@,是否是主线程:%@...2222···%d",[NSThread currentThread],[NSThread isMainThread]?@"是":@"否",i);//当前线程:<NSThread: 0x604000272540>{number = 4, name = (null)},是否是主线程:否...2222···0
}
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"当前线程:%@,是否是主线程:%@...3333···",[NSThread currentThread],[NSThread isMainThread]?@"是":@"否");//当前线程:<NSThread: 0x604000071d40>{number = 1, name = main},是否是主线程:是...3333···
});