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

标签 swift react-native

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

相关文章:

javascript - 标签栏导航器中的图像

ios - Swift2 中 Textfield 上光标的背景阴影发生变化

android - React Native - 无法在 Android 的前台访问 Firebase 推送通知

javascript - 如何使用 React 从 action.js 中的 API 获取响应值

ios - 如何使用UIViewPropertyAnimator实现360度旋转

android - W AppOps : Noting op not finished: pkg com. google.android.gms

gradle - React Native 示例(UIExplorer)构建问题

swift - 在 Swift 中添加日期类型和 Int 类型?

ios - 如何防止 IOS Swift 上的 OneSignal 在处理通知时打开 WebView

ios - 我如何在 ReactiveCocoa 5 中将 RACDisposable 转换为 Disposable?