菜鸟教程小白 发表于 2022-12-12 16:56:16

ios - 等待来自并发线程的事件的正确方法


                                            <p><p>当应用程序转换到后台时,我偶尔会遇到与并发线程上未正确完成的任务有关的崩溃。</p>

<p>所以我有 3 个线程:</p>

<ol>
<li>A(主)。</li>
<li>B(由 GCD 管理)。</li>
<li>C(手动创建以处理密集的套接字操作)。</li>
</ol>

<p>场景如下:</p>

<p>在 <code>applicationDidEnterBackground:</code> 处理程序(肯定在 <code>thread A</code> 上执行)中,一个长时间运行的任务在 <code>thread B</code> 上开始以完成所有正在进行的操作(保存应用程序状态、关闭套接字等)。在这个任务中,我需要等到一个套接字正确完成它在 <code>thread C</code> 上的工作,然后才能继续这个长时间运行的任务。</p>

<p>以下是简化代码:</p>

<pre><code>dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Some synchronous task.
    ;

    // Here I need to wait until the socket finishes its task.
    ...

    // Continuing of the long-running task.
    ...
}
</code></pre>

<p>完成此任务的可接受方式是什么。如果我这样做可以吗?</p>

<pre><code>while (socket.isConnected)
{
      [ runMode:NSDefaultRunLoopMode beforeDate:];
}

// Continuing of the long-running task.
</code></pre>

<p>或者我当前的架构可能有问题,我需要使用 <code>NSOperation</code> 以某种方式序列化异步任务?</p>

<p><strong>更新:</strong>问题已通过使用<code>dispatch_semaphore</code>得到解决<a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW24" rel="noreferrer noopener nofollow">APIs</a>正如@Rob Napier 所建议的那样。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>首先,不要将这些视为线程,如果您使用 <code>NSThread</code> 或 <code>performSelectorInBackground:</code>(或者更糟糕的是 pthreads)创建线程,请不要不要那样做。使用 GCD。 GCD 创建<em>队列</em>。队列顺序 block ,最终确实在线程上运行,但线程是一个实现细节,队列到线程没有 1:1 的映射。见 <a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/ThreadMigration/ThreadMigration.html#//apple_ref/doc/uid/TP40008091-CH105-SW1" rel="noreferrer noopener nofollow">Migrating Away from Threads</a>更多讨论。</p>

<p>对于如何等待其他操作的问题,您可能想要的工具是 <code>dispatch_semaphore</code>。您创建信号量并将其交给两个操作。然后当你想等待某事时调用 <code>dispatch_semaphore_wait</code>,当你想表明某事已经发生时调用 <code>dispatch_sempahore_signal</code>。见 <a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW24" rel="noreferrer noopener nofollow">Using Dispatch Semaphores to Regulate the Use of Finite Resources</a>更多示例代码。在这种情况下,“有限资源”是“套接字”。您想等到另一部分完成使用它并将其返回到池中。</p>

<p>即使您使用手动线程,信号量也可以工作,但我不能强调您不应该进行手动线程。你所有的并发都应该通过 GCD 来管理。这是 iOS 中整体并发管理的重要工具。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 等待来自并发线程的事件的正确方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/33503885/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/33503885/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 等待来自并发线程的事件的正确方法