您的位置:首页 > 理论基础 > 计算机网络

使用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);
}
});
}

});
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcd 信号量