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

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

我有一个耗时的过程,并且有一个进度指示器向用户显示事情已经进展到什么程度。因为我必须在主线程上执行消耗性的操作,所以我无法选择在更新之间简单地在主队列上调度更新。我必须切换到后台线程一段时间,以便让 UI 更新,然后再切换回来并继续。

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

__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. 只做一件工作
  2. 将控制权移交给后台线程
  3. 在后台休眠
  4. 在主线程上安排下一项工作

你想做什么:

  1. 只做一件工作
  2. 安排下一项工作

代码如下:

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

你根本不需要后台线程(特别是当它所做的只是休眠时)。

关于ios - A block 带有 UI 回调的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11667793/

相关文章:

Kotlin:自定义顺序的迭代器

for-loop - 更新 map 中的键,同时遍历该 map

python - 反转字典

java - 奇怪的 Java for 循环格式

ios - 我可以将 Apple Universal Links 与 HTTP 服务器一起使用吗?

html - 覆盖滚动条不显示

ios - 从 Objective-C block 访问分配委托(delegate)属性? (iOS)

java - 使用 Java 中的多线程删除多个文件

optimization - 创建一个大集合 - 需要减少在 GC 上花费的时间

iphone - 谷歌 OAuth 错误 -1001