在swift中分组管理异步任务的方式
1 group enter 和 leave 进行同步管理
func method1() {
// 创建一个组 ,要是在一个控制器中去规划请求顺序,则这个组要是全局的组
let group = DispatchGroup();
let queue = DispatchQueue.global();
//
let imgsArr = ["http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/21.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/22.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/23.jpg"]
for i in 0 ..< imgsArr.count {
// 每一次循环进入组
group.enter();
// 进行网络请求
let session = URLSession.shared;
let task = session.dataTask(with: URL(string: imgsArr[i])!) { (data, response, error) in
if error == nil {
print("第\(i)张图片下载完成");
// 离开组
group.leave();
}
};
// 执行
task.resume();
}
// 执行完毕
// 打印结果
/* 第2张图片下载完成
第1张图片下载完成
第0张图片下载完成
图片下载完毕
*/
// 当组内所有任务都完成之后 出发notify
group.notify(queue:queue) {
print("图片下载完毕");
};
2 使用信号量进行实现
信号量是基于计数器的一种线程同步机制
func method2() {
//
let imgsArr = ["http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/111.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/112.jpg","http://qzonestyle.gtimg.cn/qzone/app/weishi/client/testimage/1024/113.jpg"]
// 创建一个信号量 默认值为0 每每发送一次 信号量+1
let sem = DispatchSemaphore.init(value: 0);
for i in 0 ..< imgsArr.count {
// 进行网络请求
let session = URLSession.shared;
let task = session.dataTask(with: URL(string: imgsArr[i])!) { (data, response, error) in
if error == nil {
print("第\(i)张图片下载完成");
// 请求成功 信号进行+1操作
sem.signal()
}
};
task.resume();
// 一共创建了三个wait函数
sem.wait(timeout: DispatchTime.distantFuture);
}
// 等待所有的wait函数都被释放的时候 任务都完成的时候 信号不为0 程序继续执行
/*
第0张图片下载完成
第1张图片下载完成
第2张图片下载完成
图片下载完毕
*/
print("图片下载完毕");
}