这是FileWatcher java 7 nio库的代码片段。 它是非阻塞代码吗?该线程等待来自FileSystem的信号。
if self.loginButton.backgroundColor == UIColor.blackColor() {
let tittle = NSAttributedString(string: "Login", attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
loginButton.setAttributedTitle(tittle, forState: .Normal)
loginButton.backgroundColor = UIColor.whiteColor()
} else {
let tittle = NSAttributedString(string: "Login", attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
loginButton.setAttributedTitle(tittle, forState: .Normal)
loginButton.backgroundColor = UIColor.blackColor()
}
答案 0 :(得分:1)
Filewatcher使用EPOLL
这是一个Linux系统调用。它是一种基于事件的多路复用机制。对于Windows,SELECT
执行相同的操作,但效率低得多,而且在BSD(OSX所基于的)中有KQUEUE
。
简单来说,它的作用是在系统中注册一个等待事件发生的事件处理程序。随着时间的推移,系统会查看所有排队的事件处理程序,并查看是否有一个已准备好继续处理。如果有一个事件处理程序将其事件标志设置为true,那么它将处理该事件。如果没有事件,它将一直循环,直到找到发生的事件。
与此同时,main中的代码继续运行,从而为您提供其承诺的“非阻塞”功能。
这不是新技术,虽然ASYNC最近因NodeJS,Swift和其他非阻塞语言/框架的兴起而变得非常受欢迎,但同样的事情是WIN32 API如何工作 - 简而言之,它基于所有事件
您可以查看此link以获得更深入的解释。