我有一个耗时的过程,并有一个进度指示器显示用户已经走了多远。因为我必须在主线程上进行消费,所以我不能在更新之间简单地在主队列上调度更新。我必须暂时切换到后台线程,以便在切换回来并继续之前让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);
答案 0 :(得分:3)
思维太复杂了。目前的设置:
你想做什么:
以下是代码:
- (void)doWork
{
if (_assetIndex < assets.count) {
[self obtainAssetAtIndex:_assetIndex++];
progressView.progress += progressPerFile;
[self performSelector:@selector(doWork) withObject:nil afterDelay:0];
} else {
[self didImportGroup];
}
}
根本不需要后台线程(特别是当它所做的一切都在睡觉时)。