2017-01-20 5 views
0

、私はいくつかの迅速なコードにstartメソッドを呼んでいるネイティブ反応し、ネイティブコンポーネントでは動作しませんタイマーは、私はJavaScriptで

import Foundation 

@objc(MyTestClass) 
class MyTestClass: RCTEventEmitter { 
    let testEventName = "testEvent" 

    override func supportedEvents() -> [String]! { 
    return [testEventName] 
    } 

    @objc func start() -> Void { 
    let timer = Timer.scheduledTimer(
     timeInterval: 0.1, 
     target: self, 
     selector: #selector(self.update), 
     userInfo: nil, 
     repeats: true) 
    RunLoop.main.add(timer, forMode: RunLoopMode.commonModes) 
    } 

    @objc func update() { 
    print("test") 
    self.sendToJs(message: "test") 
    } 

    @objc private func sendToJs(message: String) -> Void { 
    self.sendEvent(withName: testEventName, body: message) 
    } 
} 

を...タイマーを起動し、この例では、同じメッセージをJavaScriptコードに繰り返し送信し、イベントをリッスンします。

問題:this answerに概説され、メイン実行ループにタイマーを追加する場合でも、updateメソッドが呼び出されることはありません。

私はここで簡単に間違いをしていますか?私は迅速にすごいです。

もしそうでなければ、私はタイマーをJSに移動し、データのスウィフトコードを繰り返し呼び出す必要があります。私の実際のシナリオでは、データを返すタイマーは条件付きですから私はそれがあまりにも悪くないと思う...

+0

してみてください。 – ebby94

+0

@ ebby94を実行します。私は 'update'の中でブレークポイントを打った後、JSにメッセージを送りますが、ええ..一度だけ。 –

答えて

0

それを考え出した。タイマーは何らかの理由でメインスレッド上にセットアップする必要があり、メイン実行ループに追加する必要はありません。

これを次のようにstart機能を変更することで行うことができます実行ループに追加した後、 `timer.fireを()`追加

@objc func start() -> Void { 
    DispatchQueue.main.async(execute: { 
    Timer.scheduledTimer(
     timeInterval: 0.1, 
     target: self, 
     selector: #selector(self.update), 
     userInfo: nil, 
     repeats: true) 
    }) 
}