解决网络请求的依赖关系

 

怎么解决网络请求的依赖关系:当一个接口的请求需要依赖于另一个网络请求的结果

  • 思路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 ];

转载于:https://www.cnblogs.com/ruixin-jia/p/9475997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值