使用GCD 信号量来实现iOS 同步网络请求
2017-05-05 17:10
302 查看
使用 dispatch_async 模仿网络请求,使用 for 循环来模拟网络请求后的数据处理情况
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建
dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(1);
dispatch_semaphore_t semaphore2 = dispatch_semaphore_create(1);
dispatch_semaphore_t semaphore3 = dispatch_semaphore_create(1);
NSInteger num = 5;//每个 for 循环模拟5次数据操作
__block NSInteger i = 0;//在这里定义并且用 __block 修饰, 是为了在下边异步操作里获取到值
for (; i < num; i++) {
//信号量不为 >0 的时候通过
dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);
NSLog(@"fir---%ld", i);
dispatch_async(queue1, ^{
__block NSInteger j = 0;
for (; j < num; j ++) {
dispatch_semaphore_wait(semaphore2, DISPATCH_TIME_FOREVER);
NSLog(@"tow------%ld", j);
dispatch_async(queue1, ^{
__block NSInteger k = 0;
for (; k < num; k ++) {
dispatch_semaphore_wait(semaphore3, DISPATCH_TIME_FOREVER);
NSLog(@"thr------%ld", k);
dispatch_async(queue1, ^{
for (NSInteger m = 0; m < num; m ++) {
NSLog(@"fou---------%ld", m);
}
//信号量加一
dispatch_semaphore_signal(semaphore3);
if (k == num) {//因为是异步, 所以 k 的 for 循环最后一次进来的时候 k++ 之后, 所以 k==num
dispatch_semaphore_signal(semaphore2);
}
if (j == num && k == num) {
dispatch_semaphore_signal(semaphore1);
}
});
}
});
}
});
}
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建
dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(1);
dispatch_semaphore_t semaphore2 = dispatch_semaphore_create(1);
dispatch_semaphore_t semaphore3 = dispatch_semaphore_create(1);
NSInteger num = 5;//每个 for 循环模拟5次数据操作
__block NSInteger i = 0;//在这里定义并且用 __block 修饰, 是为了在下边异步操作里获取到值
for (; i < num; i++) {
//信号量不为 >0 的时候通过
dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);
NSLog(@"fir---%ld", i);
dispatch_async(queue1, ^{
__block NSInteger j = 0;
for (; j < num; j ++) {
dispatch_semaphore_wait(semaphore2, DISPATCH_TIME_FOREVER);
NSLog(@"tow------%ld", j);
dispatch_async(queue1, ^{
__block NSInteger k = 0;
for (; k < num; k ++) {
dispatch_semaphore_wait(semaphore3, DISPATCH_TIME_FOREVER);
NSLog(@"thr------%ld", k);
dispatch_async(queue1, ^{
for (NSInteger m = 0; m < num; m ++) {
NSLog(@"fou---------%ld", m);
}
//信号量加一
dispatch_semaphore_signal(semaphore3);
if (k == num) {//因为是异步, 所以 k 的 for 循环最后一次进来的时候 k++ 之后, 所以 k==num
dispatch_semaphore_signal(semaphore2);
}
if (j == num && k == num) {
dispatch_semaphore_signal(semaphore1);
}
});
}
});
}
});
}
相关文章推荐
- iOS 解决网络请求和界面刷新顺序问题(GCD信号量实现)
- ios在异步网络请求上实现同步逻辑
- ios网络学习------2 用非代理方法实现同步post请求
- IOS开发中异步网络请求上实现同步逻辑
- iOS之利用GCD信号量控制并发网络请求
- iOS网络请求总结、GET、POST、同步、异步代码块、异步代理、第三方AFNetWorking2.0使用
- GCD使用dispatch_semaphore_t创建多线程网络同步请求
- iOS网络篇---使用NSConnection 实现post和get发送和接收(同步和异步模式)
- iOS开发之使用信号量实现AFN请求同步
- IOS多线程使用GCD与信号量实现生产者与消费者模式
- iOS之利用GCD信号量控制并发网络请求
- iOS 使用Moya网络请求的实现方法
- iOS 信号量解决-网络异步请求的数据同步返回问题
- ios网络学习------2 用非代理方法实现同步post请求
- iOS开发之使用信号量实现AFN请求同步
- iOS网络编程-ASIHTTPRequest框架同步请求
- iOS之ASIHttp简单的网络请求实现
- 使用C#实现网络时间同步功能
- 对iOS网络请求的简单封装,并且使用block回调函数方式
- iOS之ASIHttp简单的网络请求实现