在Swift CLI中使用GCD

时间:2016-01-16 15:59:12

标签: ios macos swift2 command-line-interface grand-central-dispatch

所以我试图在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中。

1 个答案:

答案 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作为退出前的最后一件事来解决这个问题。此调用有效地迫使我们立即进入主队列 并拉出主排队的块并执行它,然后退出。