在我的 JavaScript 中,我在一些 swift 代码上调用 start
方法:
import {NativeModules} from "react-native";
// somewhere in JS
NativeModules.MyTestClass.start();
// somewhere else I'm listening for events from the swift code
const myModule = new NativeEventEmitter(NativeModules.MyTestClass);
const subscription = myModule.addListener("testEvent", message => {
console.log(message);
});
快速代码:
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 代码。
问题:update
方法从未被调用,即使在将计时器添加到主运行循环时也是如此,如this answer 中所述。 .
我在这里犯了一个简单的错误吗?我是 swift 的新手。
如果没有,我将不得不将计时器移至 JS,然后重复调用数据的 swift 代码......我宁愿不这样做,因为在我的真实场景中,计时器发回数据是有条件的,但我猜猜这样做还不错......
最佳答案
想通了。出于某种原因需要在主线程上设置计时器,而不需要将其添加到主运行循环中。
这可以通过将 start
函数更改为以下内容来完成:
@objc func start() -> Void {
DispatchQueue.main.async(execute: {
Timer.scheduledTimer(
timeInterval: 0.1,
target: self,
selector: #selector(self.update),
userInfo: nil,
repeats: true)
})
}
关于swift - 定时器在 native react native 组件中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755271/