出于性能调试的目的,每当由GCD并发队列操作的后台任务完成其任务之一时,我就需要观察UI更新的进度。
没有人为的延迟,很难跟踪和响应所发生的事情。
每个任务大概需要10毫秒。我希望它花一秒钟。
我尝试通过向队列中添加sleep(1);
来减慢队列的速度,但这将允许其他等待的任务运行。
我需要的是每个任务实际上一直占据着队列,直到那多余的一秒钟结束。
如何做到这一点而不必重新组织整个排队代码?毕竟,这仅用于调试,而我只想通过条件编译插入该代码,而不是为调试和非调试构建最终使用不同的代码。
答案 0 :(得分:1)
您可以旋转一定时间,例如:
func spin(for interval: CFTimeInterval) {
let start = CACurrentMediaTime()
while (CACurrentMediaTime() - start) < interval { }
}
因此,要使线程繁忙1秒钟,应该是:
spin(for: 1)
您永远不会在生产应用程序中执行此操作,但是它可能可以满足您的诊断目的。
答案 1 :(得分:1)
在此期间,我还想出了一种方法,与Rob的方法一样,通过循环消磨时间来实现:
mach_timebase_info_data_t tb;
mach_timebase_info (&tb);
double tbScale = 1.0 / (1e-9 * (double)tb.numer / (double)tb.denom);
uint64_t now, end = mach_absolute_time();
end += tbScale * 0.5; // -> wait 0.5 sconds
do {
now = mach_absolute_time();
} while (now < end);