菜鸟教程小白 发表于 2022-12-12 13:17:38

ios - 提供带有目标回调队列的异步和同步 API


                                            <p><p>我正在编写一个网络 API。由于对 <code>NSURLSession</code> 的底层调用始终是异步的,因此我默认提供了一个异步 API:</p>

<pre><code>- (void) callBackendServerWithCompletion: (dispatch_block_t) completion;
</code></pre>

<p>提供此 API 的同步版本也非常方便,例如简化在 Xcode Playground 中测试代码。同步调用是按照异步调用来写的:</p>

<pre><code>- (void) callBackendSynchronously
{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self callBackendServerWithCompletion:^{
      dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
</code></pre>

<p>这很好用。</p>

<p>现在我想添加一个额外的便利功能,一个默认调度队列来调用完成 block 。此回调队列默认为 UI 队列,因此此 API 的使用者不必一直 <code>dispatch_async(dispatch_get_main_queue(), ^{…})</code>:</p>

<pre><code>// This:
[webservice callBackendServerWithCompletion:^{
    dispatch_async(dispatch_get_main_queue(), ^{
      ;
    });
}];

// Would be replaced with this:
[webservice callBackendServerWithCompletion:^{
    // Guaranteed to run on the main queue
    ;
}];
</code></pre>

<p>这很容易做到,但是现在我在主队列上调用同步方法时出现了死锁:</p>

<ol>
<li><code>-callBackendSynchronously</code> 调用 <code>-callBackendServerWithCompletion</code> 并等待信号量。</li>
<li>异步方法处理网络请求并在主队列上调度回调。</li>
<li>由于主队列已经在等待信号量,所以代码会死锁。</li>
</ol>

<p>提供所有三个功能的简单方法是什么,即。同步和异步 API 方法以及默认回调队列?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>添加一个私有(private)的、重载版本的 <code>callBackendServerWithCompletion</code> 接受调度队列。在 <code>callBackendSynchronously</code> 中,使用自定义后台队列调用这个新的重载方法。 </p>

<p>最后,在您原来的<code>callBackendServerWithCompletion</code> 方法中调用重载版本,将默认队列作为参数传递。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 提供带有目标回调队列的异步和同步 API,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43180988/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43180988/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 提供带有目标回调队列的异步和同步 API