接口只提供同步接口,遇到依赖的数据只有异步才能获取的情况就不好处理,需要在同步方法里兼容异步方法,把异步方法改造成同步的效果。
举个例子,下图执行顺序是
- 阻塞当前线程,等待数据(主线程
- 子线程回调,拿到数据(全局队列
-
当前线程继续执行,返回数据
1-1
方案一 - DispatchSemaphore
使用分三步
- 创建
let semp = DispatchSemaphore(value: 0)
- wait
semp.wait()
- signal
semp.signal()
其中wait会阻塞线程是关键,wait会依据value决定是否阻塞当前线程
- 如果 value > 0 就阻塞,否则不阻塞
-
如果当前 value == 0,会等待 wait 超时或是 signal 被执行,然后再释放当前线程。
下图中 value 是0,所以 wait 阻塞当前线程,直到 signal 被执行。
1-2
注意
wait 和 signal 需要在不同线程调用,否则会因为 wait 阻塞是 signal 无法被调用。例如1-1图例中,1中 wait 在主线程调用,2中 signal 需要通过 context 指定在全局队列也就是子线程回调,因为这里默认是在主线程回调。
1-1
方案二 - DispatchGroup
DispatchGroup的用法
网友评论