美文网首页
异步改为同步

异步改为同步

作者: tom__zhu | 来源:发表于2023-10-14 10:18 被阅读0次

接口只提供同步接口,遇到依赖的数据只有异步才能获取的情况就不好处理,需要在同步方法里兼容异步方法,把异步方法改造成同步的效果。
举个例子,下图执行顺序是

  1. 阻塞当前线程,等待数据(主线程
  2. 子线程回调,拿到数据(全局队列
  3. 当前线程继续执行,返回数据


    1-1

方案一 - DispatchSemaphore

使用分三步

  1. 创建 let semp = DispatchSemaphore(value: 0)
  2. wait semp.wait()
  3. signal semp.signal()

其中wait会阻塞线程是关键,wait会依据value决定是否阻塞当前线程

  1. 如果 value > 0 就阻塞,否则不阻塞
  2. 如果当前 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的用法


相关文章

网友评论

      本文标题:异步改为同步

      本文链接:https://www.haomeiwen.com/subject/rlgabdtx.html