Perfect
libraryを使用して私のUbuntu(Ubuntu 15.10 wily、Swift swift-3.0.1-RELEASE)でSwiftでアプリケーションを作成しようとしています。Swift 3 Linux with Perfect:予定のタイマーをrunLoopに追加する
私は毎秒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
からかあれば私のクラスを拡張していた場合
$> 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)
私はセレクタを使用していない他の宣言を使用してみました:私は、引数timer
を削除
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()
は一度だけ、私の関数を呼び出します)。そして最後に:
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回印刷されていますが、(パーフェクトライブラリを使用して)私のサーバーは最後に開始されます。
$> 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
私が何をしようとするもう知りません。パーフェクトライブラリの問題かもしれませんが、私の心配を解決するためのものは何も見つかりません。私は多分新しいスレッドを実行し、それで私のタイマーを開始することができますが、それは少し複雑になる?
コーディング
安全かつ簡便な非常に一般的なサーバ側はどうもありがとうございましたです。これは完璧です。 :) –
@ PerfectlyRockどのようにThreading.dispatch {}を繰り返すことができますか? –
あなたの話していることは分かりません。あなたはThreading.dispatch {forloop()またはwhileloop()}か、function(){Threading.dispatch {}}を次に_ in 0〜10 {function()}に作成できます。 – PerfectlyRock