gpt4 book ai didi

swift - 定时器在 native react native 组件中不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 06:35:51 24 4
gpt4 key购买 nike

在我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com