2016-12-26 26 views
4

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 

私が何をしようとするもう知りません。パーフェクトライブラリの問題かもしれませんが、私の心配を解決するためのものは何も見つかりません。私は多分新しいスレッドを実行し、それで私のタイマーを開始することができますが、それは少し複雑になる?

答えて

4

パーフェクトを真剣に使用している場合は、ファンデーションを使用しないでください。パーフェクトスレッディングをお試しください: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 

それは

+0

コーディング
安全かつ簡便な非常に一般的なサーバ側はどうもありがとうございましたです。これは完璧です。 :) –

+0

@ PerfectlyRockどのようにThreading.dispatch {}を繰り返すことができますか? –

+0

あなたの話していることは分かりません。あなたはThreading.dispatch {forloop()またはwhileloop()}か、function(){Threading.dispatch {}}を次に_ in 0〜10 {function()}に作成できます。 – PerfectlyRock

関連する問題