差异需要MainQueueSetup和dispatch_get_main_queue?

Ilj*_*lja 11 queue multithreading ios react-native

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

有关线程的官方文档提及此代码块及其变体

- (dispatch_queue_t)methodQueue
{
  return dispatch_get_main_queue();
}
Run Code Online (Sandbox Code Playgroud)

我在第三方图书馆看到了另一个无证件的和平

+ (BOOL)requiresMainQueueSetup
{
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这些看起来有点类似但不同,因此我想要求对以下问题进行解释

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

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

  3. 可以dispatch_get_main_queuerequiresMainQueueSetup可以一起使用,如果是这样的话何时何地?

  4. 是什么返回之间的差异YESNO距离requiresMainQueueSetup

den*_*emm 18

  1. dispatch_get_main_queue()无论何时处理将影响主线程的辅助线程上的事件,您都需要.通常,这涉及UI更改.如果要创建不涉及本机呈现的react-native模块,则可能不需要主队列.应该在辅助线程上调用异步内容,这是您要实现的地方dispatch_get_main_queue(),以确保在异步操作完成时UI得到更新.

  2. 几周前我在SO上问了同样的问题没有成功,经过一些研究我现在知道这与子弹号1有关.React-native希望你实现这个方法(与iOS没有任何关系),以及你需要返回YES才能进行原生iOS渲染.这将确保您的本机模块在主线程上运行,这在UI交互的情况下是相关的.您不希望应用程序在重负载处理时冻结您的UI.

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

  4. 这已在之前的子弹中得到解决

编辑:一些额外的信息只是为了确保一切都清楚.总结一下:requiresMainQueueSetup()与iOS无关,只能通过react-native创建,以了解您的本机模块的意图(UI或其他).dispatch_get_main_queue()与react-native无关,仅与您的本机代码相关.它基本上是辅助线程的回调,以通知主线程一些异步操作已完成.

  • 这是一个了不起的解释!为了对我来说是一成不变的,我正在开发一个陀螺仪模块,该模块每隔50ms左右返回一次x,y,z值,考虑到它不执行任何本机UI渲染,而是使用react-native(js )当我收到新值时,我正在执行ui更改。我不确定这是否需要`dispatch_get_main_queue`? (2认同)
  • 不,在这种情况下,您将不需要dispatch_get_main_queue。react-native桥会将新值发送到您的JS代码,在这里,react-native JS线程将负责控制,您不必担心线程问题了 (2认同)