通过示例了解何时使用dispatch_get_main_queue和requireMainQueueSetup

2024-03-24

不久前我在这里问过类似的问题:requireMainQueueSetup 和dispatch_get_main_queue 的区别? https://stackoverflow.com/questions/50773748/difference-requiresmainqueuesetup-and-dispatch-get-main-queue

今天我回过头来才发现我还没有完全掌握它。当我们为 iOS 编写 React Native 模块时dispatch_get_main_queue在ios端和requiresMainQueueSetup反应原生需要。

如何以及哪一个应该用于以下包和用例?

asq-react-native-device https://github.com/Asimetriq/asq-react-native-device- 导出捆绑包 ID 等常量的包

asq-react-native-传感器 https://github.com/Asimetriq/asq-react-native-sensors- 允许订阅和接收来自设备陀螺仪和其他传感器的数据的包

asq-react-native-google-登录 https://github.com/Asimetriq/asq-react-native-google-sign-in- 包 tat 在 sdk 中暴露了 google 登录

For all of these I receive warnings in my dev console i.e. enter image description here

所以我假设requiresMainQueueSetup不管所有包都需要使用吗?我很难掌握何时需要将其设置为YES or NO然而。这些模块都不是ui组件,但是google登录其中一个,打开safari视图控制器来执行oAuth,这个平均值是否需要设置为YES here?

我需要使用吗dispatch_get_main_queue每当我使用任何反应本机解析器/拒绝器桥接方法时?


虽然这两种方法都与 RN 与模块交互的方式相关,但它们并不相同。

+ (BOOL)requiresMainQueueSetup

此方法确定您的模块是否将在主线程上初始化或不;换句话说,如果你的模块的构造函数(init方法)和constantsToExport方法将在主线程上调用。

- (dispatch_queue_t)methodQueue

这个方法是一个重写,你可以告诉 RN 在调用模块的调度队列时使用哪个调度队列导出方法(使用导出RCT_EXPORT_METHOD宏)。返回dispatch_get_main_queue()这里返回属于主线程的主队列,要求 RN 在主线程上调用您导出的方法,但如果您有这样的需求,您可以使用任何其他自定义调度队列。

主线程执行

如果我们要简化这一点,任何涉及 UI 操作的操作都需要在主线程或主调度队列上执行。即使你的模块不是 UI 组件还有其他 UI 操作可以从本机模块执行,例如:呈现视图控制器(可以是系统视图控制器或自定义视图控制器)


如您所见,您收到的所有警告都源于缺乏requiresMainQueueSetup实现,它会告诉你确切的原因 - 一个模块正在覆盖init or the constantsToExport方法,但未指定是否希望在主线程上执行。到目前为止,覆盖的模块init or the constantsToExport默认情况下在主线程上初始化,假设它们可能需要访问 UI 元素或UIKit。在未来的 RN 版本中,这种情况将会改变——只有当你明确这么说时,这些方法才会在主线程上被调用。

有问题的包裹

看起来你并没有在做某事init or constantsToExport这需要主线程,但目前就好像您正在覆盖requiresMainQueueSetup并返回YES。我建议你do覆盖它并返回 NO,这样您就可以测试一切是否按预期工作,并确保当 RN 在未来的 RN 版本中默认为您的情况时不会有任何意外。

请注意,即使这些不是 UI 组件,有时在调用导出方法时确实需要主线程,例如asq-react-native-google-sign-in - the signIn方法正在呈现和解除视图控制器。在这种情况下,您正确地覆盖了methodQueue并将主队列用于导出的方法。

请注意,也可以通过不重写来将方法调用保留在 RN 后台线程中methodQueue,并在必要时自行调度到主队列。例如:

dispatch_async(dispatch_get_main_queue(), ^{
    [RCTPresentedViewController() dismissViewControllerAnimated:YES completion:nil];
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过示例了解何时使用dispatch_get_main_queue和requireMainQueueSetup 的相关文章

随机推荐