Perfect
ライブラリを使用して、Ubuntu (Ubuntu 15.10 wily、Swift swift-3.0.1-RELEASE) で Swift でアプリケーションを作成しようとしています。
X 秒ごとに呼び出される関数が必要です。そのために、モジュールのTimer
クラスをFoundation
使用しています:
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
場合、または引数を削除した場合の別のコンパイル エラー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")
}
}
}
コンパイルは機能しますが、2 番目のプリントは呼び出されません。また、タイマーを現在のに手動で追加しようとしました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()
、私の関数を1回だけ呼び出します)。そして最後に:
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
何を試せばいいのかわからない。パーフェクトライブラリの問題かもしれませんが、悩みを解決するものが見つかりません。新しいスレッドを実行して、タイマーを開始することもできますが、少し複雑になりますか?