怎么解决网络请求的依赖关系:当一个接口的请求需要依赖于另一个网络请求的结果
-
思路1:操作依赖:NSOperation 操作依赖和优先级(不适用,异步网络请求并不是立刻返回,无法保证回调时再开启下一个网络请求)
1 | [operationB addDependency:operationA]; // 操作B依赖于操作 |
-
思路2:逻辑判断:在上一个网络请求的响应回调中进行下一网络请求的激活(不适用,可能拿不到回调)
-
思路3:线程同步 -- 组队列(dispatch_group)
1 2 3 4 5 6 7 8 | dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ /*加载图片1 */ }); dispatch_group_async(group, queue, ^{ /*加载图片2 */ }); dispatch_group_async(group, queue, ^{ /*加载图片3 */ }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 合并图片… … }); |
-
思路4:线程同步 --阻塞任务(dispatch_barrier):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* 创建并发队列 */ dispatch_queue_t concurrentQueue = dispatch_queue_create( "test.concurrent.queue" , DISPATCH_QUEUE_CONCURRENT); /* 添加两个并发操作A和B,即A和B会并发执行 */ dispatch_async(concurrentQueue, ^(){ NSLog(@ "OperationA" ); }); dispatch_async(concurrentQueue, ^(){ NSLog(@ "OperationB" ); }); /* 添加barrier障碍操作,会等待前面的并发操作结束,并暂时阻塞后面的并发操作直到其完成 */ dispatch_barrier_async(concurrentQueue, ^(){ NSLog(@ "OperationBarrier!" ); }); /* 继续添加并发操作C和D,要等待barrier障碍操作结束才能开始 */ dispatch_async(concurrentQueue, ^(){ NSLog(@ "OperationC" ); }); dispatch_async(concurrentQueue, ^(){ NSLog(@ "OperationD" ); }); |
-
思路5:线程同步 -- 信号量机制(dispatch_semaphore):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* 创建一个信号量 */ dispatch_semaphore_t semaphore = dispatch_semaphore_create( 0 ); /* 任务1 */ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{ /* 耗时任务1 */ NSLog(@ "任务1开始" ); [NSThread sleepForTimeInterval: 3 ]; NSLog(@ "任务1结束" ); /* 任务1结束,发送信号告诉任务2可以开始了 */ dispatch_semaphore_signal(semaphore); }); /* 任务2 */ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{ /* 等待任务1结束获得信号量, 无限等待 */ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); /* 如果获得信号量则开始任务2 */ NSLog(@ "任务2开始" ); [NSThread sleepForTimeInterval: 3 ]; NSLog(@ "任务2结束" ); }); [NSThread sleepForTimeInterval: 10 ]; |