带有UI回调的for循环块

时间:2012-07-26 10:58:18

标签: ios optimization for-loop objective-c-blocks grand-central-dispatch

我有一个耗时的过程,并有一个进度指示器显示用户已经走了多远。因为我必须在主线程上进行消费,所以我不能在更新之间简单地在主队列上调度更新。我必须暂时切换到后台线程,以便在切换回来并继续之前让UI更新。

这就是我所拥有的,但感觉非常不正统。有没有更好的方法来做"阻止循环回调到UI"在那里,我失踪了吗?我还不完全确定这是否真的能够最终解除阻止,但那是另一个故事。

__block NSUInteger i = 0;
__block dispatch_block_t obtainBlock;

obtainBlock = [^{
    [self obtainAssetAtIndex:i];
    progressView.progress += progressPerFile;
    i++;
    if (i < assets.count) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
            usleep(500);
            dispatch_async(dispatch_get_main_queue(), obtainBlock);
        });
    } else {
        [self didImportGroup];
        [obtainBlock release];
    }
} copy];

dispatch_async(dispatch_get_main_queue(), obtainBlock);

1 个答案:

答案 0 :(得分:3)

思维太复杂了。目前的设置:

  1. 做一件事
  2. 手动控制到后台线程
  3. 在后台睡觉
  4. 安排主线程的下一部分工作
  5. 你想做什么:

    1. 做一件事
    2. 安排下一项工作
    3. 以下是代码:

      - (void)doWork
      {
          if (_assetIndex < assets.count) {
              [self obtainAssetAtIndex:_assetIndex++];
              progressView.progress += progressPerFile;
              [self performSelector:@selector(doWork) withObject:nil afterDelay:0];
          } else {
              [self didImportGroup];
          }
      }
      

      根本不需要后台线程(特别是当它所做的一切都在睡觉时)。