菜鸟教程小白 发表于 2022-12-13 15:20:47

ios - 带有 UI 回调的 block for 循环


                                            <p><p>我有一个耗时的过程,并且有一个进度指示器向用户显示事情的进展情况。因为我必须在主线程上做消耗的事情,所以我没有选择在更新之间简单地在主队列上分派(dispatch)更新。我必须暂时切换到后台线程,以便在切换回并继续之前让 UI 更新。 </p>

<p>这是我拥有的,但感觉很不正统。有没有更好的方法来执行我缺少的“带有回调到 UI 的循环 block ”?我也不完全确定这是否真的会最终释放 block ,但这是另一回事。</p>

<pre><code>__block NSUInteger i = 0;
__block dispatch_block_t obtainBlock;

obtainBlock = [^{
    ;
    progressView.progress += progressPerFile;
    i++;
    if (i &lt; assets.count) {
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
            usleep(500);
            dispatch_async(dispatch_get_main_queue(), obtainBlock);
      });
    } else {
      ;
      ;
    }
} copy];

dispatch_async(dispatch_get_main_queue(), obtainBlock);
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>思路太复杂了。当前设置:</p>

<ol>
<li>做一件事情</li>
<li>将控制权交给后台线程</li>
<li>在后台 sleep </li>
<li>在主线程上安排下一项工作</li>
</ol>

<p>你想做什么:</p>

<ol>
<li>做一件事情</li>
<li>安排下一项工作</li>
</ol>

<p>代码如下:</p>

<pre><code>- (void)doWork
{
    if (_assetIndex &lt; assets.count) {
      ;
      progressView.progress += progressPerFile;
      ;
    } else {
      ;
    }
}
</code></pre>

<p>您根本不需要后台线程(尤其是当它所做的只是休眠时)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 带有 UI 回调的 blockfor 循环,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11667793/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11667793/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 带有 UI 回调的 block for 循环