Swift 3 Linux with Perfect: 添加一个带间隔的预定定时器到runLoop
Swift 3 Linux with Perfect: Add a scheduled timer with interval to the runLoop
我正在尝试在 Ubuntu 上 Swift 申请(Ubuntu 15.10 wily,Swift swift-3.0.1- RELEASE) 使用 Perfect
library.
我想要每 X 秒调用一个函数。为此,我使用 Timer
class of the Foundation
module:
class MyTimer {
init() {
var timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MyTimer.onTimer(timer:)), userInfo: nil, repeats: true)
}
@objc func onTimer(timer: Timer) {
print("MyTimer.onTimer")
}
}
尽管用这段代码找到了几个解决方案,但编译失败:
$> swift build
Compile Swift Module 'my-app' (7 sources)
/home/.../Sources/MyTimer.swift:8:16: error: method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C
@objc func onTimer(timer: Timer) {
另一个编译错误,如果我从 NSObject
扩展我的 class 或者如果我删除参数 timer
:
$> swift build
Compile Swift Module 'my-app' (7 sources)
/home/.../Sources/MyTimer.swift:6:83: error: '#selector' can only be used with the Objective-C runtime
var timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MyTimer.onTimer), userInfo: nil, repeats: true)
我尝试使用其他不使用选择器的声明:
class MyTimer {
init() {
print("MyTimer.init")
var timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
timer in
print("MyTimer.onTimer")
}
}
}
编译有效,但从未调用我的第二次打印。我还尝试手动将我的计时器添加到当前 RunLoop
:
class MyTimer {
init() {
print("MyTimer.init")
var timer = Timer(timeInterval: 1, repeats: true) {
timer in
print("MyTimer.onTimer")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
// timer.fire()
}
}
再也没有调用过(timer.fire()
只调用过一次我的函数)。最后:
class MyTimer {
init() {
print("MyTimer.init")
let timer = Timer(timeInterval: 1, repeats: true) {
timer in
print("MyTimer.onTimer")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
RunLoop.current.run(until: Date(timeIntervalSinceNow: 4.0))
}
}
我的消息"MyTimer.onTimer"
打印了5次,但是我的服务器(使用Perfect库)只在最后启动:
$> swift build && ./.build/debug/my-app 8400
Compile Swift Module 'my-app' (7 sources)
Linking ./.build/debug/my-app
MyTimer.init
MyTimer.onTimer
MyTimer.onTimer
MyTimer.onTimer
MyTimer.onTimer
MyTimer.onTimer
[INFO] Starting HTTP server on 0.0.0.0:8181
我不知道该尝试什么了。 Perfect库可能有问题,但我找不到任何解决办法。我也许可以 运行 一个新线程,并在其中启动我的计时器,但它有点复杂?
如果你认真使用 Perfect,请不要使用 Foundation 的东西。尝试完美线程:http://www.perfect.org/docs/thread.html
import PerfectThread
#if os(Linux)
import GlibC
#else
import Darwin
#endif
Threading.dispatch {
sleep(10) // wait for 10 seconds
doSomething()
}//end threading
安全简单
非常典型的服务器端编码
我正在尝试在 Ubuntu 上 Swift 申请(Ubuntu 15.10 wily,Swift swift-3.0.1- RELEASE) 使用 Perfect
library.
我想要每 X 秒调用一个函数。为此,我使用 Timer
class of the Foundation
module:
class MyTimer {
init() {
var timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MyTimer.onTimer(timer:)), userInfo: nil, repeats: true)
}
@objc func onTimer(timer: Timer) {
print("MyTimer.onTimer")
}
}
尽管用这段代码找到了几个解决方案,但编译失败:
$> swift build
Compile Swift Module 'my-app' (7 sources)
/home/.../Sources/MyTimer.swift:8:16: error: method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C
@objc func onTimer(timer: Timer) {
另一个编译错误,如果我从 NSObject
扩展我的 class 或者如果我删除参数 timer
:
$> swift build
Compile Swift Module 'my-app' (7 sources)
/home/.../Sources/MyTimer.swift:6:83: error: '#selector' can only be used with the Objective-C runtime
var timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MyTimer.onTimer), userInfo: nil, repeats: true)
我尝试使用其他不使用选择器的声明:
class MyTimer {
init() {
print("MyTimer.init")
var timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
timer in
print("MyTimer.onTimer")
}
}
}
编译有效,但从未调用我的第二次打印。我还尝试手动将我的计时器添加到当前 RunLoop
:
class MyTimer {
init() {
print("MyTimer.init")
var timer = Timer(timeInterval: 1, repeats: true) {
timer in
print("MyTimer.onTimer")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
// timer.fire()
}
}
再也没有调用过(timer.fire()
只调用过一次我的函数)。最后:
class MyTimer {
init() {
print("MyTimer.init")
let timer = Timer(timeInterval: 1, repeats: true) {
timer in
print("MyTimer.onTimer")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
RunLoop.current.run(until: Date(timeIntervalSinceNow: 4.0))
}
}
我的消息"MyTimer.onTimer"
打印了5次,但是我的服务器(使用Perfect库)只在最后启动:
$> swift build && ./.build/debug/my-app 8400
Compile Swift Module 'my-app' (7 sources)
Linking ./.build/debug/my-app
MyTimer.init
MyTimer.onTimer
MyTimer.onTimer
MyTimer.onTimer
MyTimer.onTimer
MyTimer.onTimer
[INFO] Starting HTTP server on 0.0.0.0:8181
我不知道该尝试什么了。 Perfect库可能有问题,但我找不到任何解决办法。我也许可以 运行 一个新线程,并在其中启动我的计时器,但它有点复杂?
如果你认真使用 Perfect,请不要使用 Foundation 的东西。尝试完美线程:http://www.perfect.org/docs/thread.html
import PerfectThread
#if os(Linux)
import GlibC
#else
import Darwin
#endif
Threading.dispatch {
sleep(10) // wait for 10 seconds
doSomething()
}//end threading
安全简单
非常典型的服务器端编码