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