在开发中我们很容易遇到这样嘚需求,需要我们同时做多个网络请求所有网络请求都完成后才能进行下一步的操作。如下载多个图片下载完了才能展示。
今天我们僦来研究一下这个问题的解决方案
运行,看看我们的控制台输出:
#warning - 绝对不要在应用主线程中等待一个Operation,只能在第二或次要线程中等待阻塞主线程将导致应用无法响应用户事件,应用也将表现为无响应。遍历—>发起任务—>等待—>任务完成信号量加1—>等待结束,开始下一个任务
发起任务—>等待—>任务完成信号量加1—>等待结束,开始下一个任务
发起任务—>等待—>任务完成信号量加1—>等待结束,开始下一个任务
这样循环的模式,一个任务完成才能接着去做下面的任务满足我们的需求。
但我们也要发现这样一个问题我们使用这种方式,可以明显感觉出整个过程需要花费的时间大大增加了不像我们 3 中同时(几乎)开启任务等待完成回调,这里是一个网络请求发出等待,完成后发出第二个网络请求等待,完成后再发出第三个这样我们等待的时间是10个网络请求每一个回调时间的和,在时间上大大增加了消耗而且对于dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER),它是会阻塞线程的我们如果需要在网络请求完成后修改UI,那这种方式会影响我们的界面交互,接下来我们对比一下两者时间消耗:
所以大家还请谨慎使用