美文网首页
异步改为同步

异步改为同步

作者: 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