所以我试图在CLI中使用GCD。为了测试它,我写了一些像这样的代码:
import Foundation
var i = 0
print("a: ",i)
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
for n in 1..<10{
i++
}
print("c: ",i)
dispatch_async(dispatch_get_main_queue()){
print("d: ",i)
}
}
print("b: ",i)
sleep(5)
print("e: ",i)
这个输出是: a:0 b:0 c:9 e:9
最后一行打印几秒钟后。我试图找出的是d发生了什么?我放入该块的任何内容似乎都没有执行。这在我在iOS中使用时效果很好,而不是在CLI中。
答案 0 :(得分:1)
CLI缺乏应用程序的持久性。它在var startTime = Date.now();
var fps = 40;
var frames = 0;
var interval = 1000 / fps;
function mainloop() {
frames++;
var timeElapsed = Date.now() - startTime,
averageFps = 1000 * frames / timeElapsed;
if(averageFps < fps && interval > 0) interval -= 0.1;
if(averageFps > fps) interval += 0.1;
setTimeout(mainloop, interval);
// update logic goes here
}
setTimeout(mainloop, interval);
有机会被打印之前就结束了(终止)。
正如@ user3441734正确指出的那样,你可以在CLI中通过调用d
作为退出前的最后一件事来解决这个问题。此调用有效地迫使我们立即进入主队列 并拉出主排队的块并执行它,然后退出。