【发布时间】:2012-07-26 10:58:17
【问题描述】:
我有一个耗时的过程,并且有一个进度指示器向用户显示事情已经完成了多远。因为我必须在主线程上做消耗的事情,所以我没有选择在更新之间简单地在主队列上分派更新。我必须暂时切换到后台线程,以便在切换回并继续之前让 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);
【问题讨论】:
-
您需要在
else子句中设置obtainBlock = nil以解除分配块。为什么要在主线程上消费? -
为什么我需要将它设置为 nil?它在对块的最终调用中被释放。
-
你是对的。我错过了。
标签: ios optimization for-loop objective-c-blocks grand-central-dispatch