我正在努力学习如何为iOS创建react-native 模块,有一个方面出现了

Official documentation on threading提到了这段代码及其变体

- (dispatch_queue_t)methodQueue
{
  return dispatch_get_main_queue();
}

我在第三方图书馆看到了另一个未经记录的和平,就是这样

+ (BOOL)requiresMainQueueSetup
{
    return NO;
}

对我来说,这些看起来有点相似,但又有点不同,因此我想问一下以下问题的解释

  1. 什么时候应该将dispatch_get_main_queue添加到模块中?如果省略,会发生什么情况?

  2. 什么时候应该将requiresMainQueueSetup添加到模块中?如果省略,会发生什么情况?

  3. dispatch_get_main_queuerequiresMainQueueSetup可以一起使用吗?如果可以,为什么和什么时候?

  4. requiresMainQueueSetup返回YESNO有什么区别?

推荐答案

  1. 每当在次线程上处理会影响主线程的事件时,都需要dispatch_get_main_queue().通常这涉及到用户界面的更改.如果要创建不涉及本机渲染的react-native 模块,则可能不需要主队列.异步的东西应该在一个辅助线程上被调用,在这里你将实现dispatch_get_main_queue(),以确保你的UI在异步操作完成后得到更新.

  2. 几周前,我问了同样的问题,但没有成功.经过一些研究,我现在知道这与1号子弹有关.React native希望您实现此方法(与iOS没有任何关系),如果您想要执行本机iOS渲染,则需要返回YES.这将确保本机模块在与UI交互相关的主线程上运行.你不希望应用程序冻结你的UI,以防繁重的处理.

  3. 如果您不提供requiresMainQueueSetup(),我们将向您发出警告,但此时会将其设置为"是".在即将发布的版本中,该默认值将更改为"否".因此,回答您的问题:它们可以一起使用,但并非所有组合都有意义.同样在这种情况下,如果不创建新的本机iOS UI组件,则可能不需要通过dispatch_get_main_queue()访问主线程.react native bridge将确保本机事件和方法始终从iOS传输到JS,反之亦然,无论它们在哪个线程上运行.

  4. 这一点在前面的几点中已经提到

编辑:

React-native相关问答推荐

没有给出相同价值观的时刻

Touchabble 不透明度不工作-react 本机

导航堆栈不显示

我们在react钩子中还需要功能性的 setState 方式吗?

在 create-react-native-app 元素中突然看到错误Plugin/Preset files are not allowed to export objects, only functions

什么时候适合在 React 中使用构造函数?

TabNavigator 中的 React Navigation 传递props

redux-saga:如何以编程方式为yields 创建多个calls/side-effects?

在 CircleCI 上 ReactNative 0.59.x build fails on CircleCI with exit value 137

使用 react-native 单击时如何更改图像和文本 colored颜色 ?

在 react-native 和 firebase 3.1 中登录 Facebook

XCode AppIcon 基于方案

try 在 Android 上运行我的 React Native 应用程序时出错

如何使用 Expo 在真实的 iOS 设备上运行应用程序?

如何将props传递给 React Navigation 导航器中的组件?

React Native Bullet Character? or Unicode?

如何使 react-native Picker 停留在新 Select 的选项?

如何隐藏 React Native NavigationBar

Node.js 在 React-Native 中的作用是什么?

以编程方式读取 app.json(或 exp.json)