博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决网络请求的依赖关系
阅读量:6989 次
发布时间:2019-06-27

本文共 2081 字,大约阅读时间需要 6 分钟。

 

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

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

你可能感兴趣的文章
Python爬虫之简单爬虫框架实现
查看>>
python isinstance内建函数的使用
查看>>
老师不能把你怎样,但外面的世界可以!
查看>>
css居中div的几种常用方法
查看>>
css3
查看>>
根据某个元素做相对定位
查看>>
C# Window编程随记——ClickOnce程序部署
查看>>
小白系列-免费广告路由器web认证设置(2)
查看>>
Top 16 Java 应用类 - 这些功能再也不用自己写了
查看>>
面试题之矩阵与转置矩阵相乘
查看>>
linux光盘、U盘的挂载与卸载
查看>>
linux sudo命令
查看>>
LeetCode-最长回文子串
查看>>
【HDOJ】3400 Line belt
查看>>
JVM Guide
查看>>
大数模版
查看>>
HDU4044 GeoDefense(树形dp+分组背包)
查看>>
Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
查看>>
JavaScript常用标签和方法总结
查看>>
GO语言的进阶之路-网络编程之socket
查看>>