【问题标题】:Difference requiresMainQueueSetup and dispatch_get_main_queue?区别需要MainQueueSetup 和dispatch_get_main_queue?
【发布时间】:2018-11-19 06:55:23
【问题描述】:

我正在尝试了解如何为 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有什么区别?

【问题讨论】:

    标签: ios multithreading react-native queue


    【解决方案1】:
    1. dispatch_get_main_queue 当您的原生模块的方法需要在运行时(主要)访问 UI 时,应该添加。它可以放在即时方法队列中,或者其他解决方案是包装一个代码块,例如 *dispatch_async(dispatch_get_main_queue(), ^ {

      这里有一些代码 })*

    2. requiresMainQueueSetup 是一个类方法(用 + 号表示),它只在初始化时起作用。因此,如果您的 init 方法正在调用 UI 或您覆盖 constantToExport 方法,则需要它。

    3. 上面已经解决了。

    4. 上面已经解决了。

    【讨论】:

      【解决方案2】:
      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 无关,仅与您的本机代码相关。它基本上是辅助线程的回调,以通知主线程一些异步操作已完成。

      【讨论】:

      • 这是一个了不起的解释!为了为我设置这一点,我正在开发一个陀螺仪模块,它每 50 毫秒左右返回一次 x、y、z 值,考虑到这一点,它不做任何原生 UI 渲染,而是在 react-native (js ) 当我收到新值时,我正在执行 ui 更改。我有点不确定这是否需要dispatch_get_main_queue
      • 不,在这种情况下你不需要 dispatch_get_main_queue。 react-native 桥会将新值发送到您的 JS 代码,react-native JS 线程将在其中控制,您不必再担心线程了
      猜你喜欢
      • 2010-10-26
      • 2018-03-11
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多