我有一个耗时的过程,并且有一个进度指示器向用户显示事情已经进展到什么程度。因为我必须在主线程上执行消耗性的操作,所以我无法选择在更新之间简单地在主队列上调度更新。我必须切换到后台线程一段时间,以便让 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);
最佳答案
思路太复杂了。当前设置:
- 只做一件工作
- 将控制权移交给后台线程
- 在后台休眠
- 在主线程上安排下一项工作
你想做什么:
- 只做一件工作
- 安排下一项工作
代码如下:
- (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/