使用NSTimer时,Swift无法输出

时间:2016-01-12 12:23:16

标签: swift stdout nstimer mainrunloop

我使用NSTimer每秒尝试输出到STDOUT。

我编写了以下代码并将其保存为sample.swift。

#!/usr/bin/swift

import AppKit

class Foo : NSObject {
  override init() {
    super.init()
    NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "bar", userInfo: nil, repeats: true)
  }

  func bar() {
    print("buz")
  }
}

let h = Foo()

// Output successful
// while true {
//   print("Foo!")
// }

NSRunLoop.mainRunLoop().run()

然后,我执行了以下命令,可以看到buz

okada@iyokan$ ./sample.swift
buz
buz
buz
buz

所以,我执行了以下命令,但我看不到任何buz

okada@iyokan$ ./sample.swift > sample.log # wait 5 seconds
okada@iyokan$ cat sample.log
okada@iyokan$ 

顺便说一句,我尝试了while循环版本(激活注释掉上面的代码)然后我可以通过两个程序得到buz

为什么我无法获得任何buz? 请教我。

1 个答案:

答案 0 :(得分:3)

这是"正常" stdio库的行为。文件描述符 可以"缓冲",这意味着所有printf()和...的结果 其他输出操作首先进入内部缓冲区。当那个 缓冲区达到一定的大小(例如8KB),其内容写入实际 文件。

有三种模式:"无缓冲" (所有输出都写入文件 立即),"线缓冲" (收集输出直到换行 字符被打印), 和#34;完全缓冲"。

根据Is stdout line buffered, unbuffered or indeterminate by default?

  

Unix惯例是stdin和stdout在与终端关联时是行缓冲的,否则是完全缓冲的(也就是块缓冲的)。

这解释了为什么您会看到每个打印操作的输出 当输出到达终端时立即,但不是在何时 输出重定向到文件。

print("buz")
fflush(stdout)

您可以强制将输出立即写入文件。 或者,您可以将标准输出设置为线缓冲模式 通过调用

setlinebuf(stdout)
在打印任何内容之前