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

Ilj*_*lja 7 objective-c ios react-native

前段时间我在这里问了类似的问题:差异需要MainQueueSetup和dispatch_get_main_queue?

我今天回来了,发现我还没完全掌握它.当我们为iOS编写反应原生模块时,dispatch_get_main_queueios方面requiresMainQueueSetup需要反应本机.

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

asq-react-native-device - 导出常量的包,如bundle id

asq-react-native-sensors - 允许从设备陀螺仪和其他传感器订阅和接收数据的软件包

asq-react-native-google-sign-in -package tat暴露谷歌登录sdk

对于所有这些,我在我的开发控制台中收到警告即 在此输入图像描述

所以我认为requiresMainQueueSetup无论所有包装都需要使用?我很难掌握何时需要设置YES或者NO.没有任何模块是ui组件,谷歌登录一个,但是,打开safari视图控制器来执行oAuth,这是否需要设置为此值YES

dispatch_get_main_queue每当我使用任何react-native解析器/ rejecter桥接方法时,我是否需要使用?

Art*_*tal 15

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

+ (BOOL)requiresMainQueueSetup

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

- (dispatch_queue_t)methodQueue

此方法是一个覆盖,您可以在调用模块的导出方法(使用RCT_EXPORT_METHOD宏导出)时告诉RN要使用哪个调度队列.返回dispatch_get_main_queue()此处返回属于主线程的主队列,要求RN在主线程上调用您的导出方法,但如果您有此类要求,则可以使用任何其他自定义调度队列.

主线程执行

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


如您所见,您获得的所有警告都源于缺少requiresMainQueueSetup实现,并且它告诉您确切的原因 - 模块覆盖initconstantsToExport方法或方法但未指定是否希望在主线程上执行它.到目前为止,默认情况下,覆盖init或者在constantsToExport主线程上初始化的模块,假设它们可能需要访问UI元素或UIKit.在将来的RN版本中,这将会发生变化 - 只有在您明确说明的情况下,才会在主线程上调用这些方法.

有问题的包裹

它看起来并不像你在做什么initconstantsToExport需要主线程,但目前它就像你压倒一切requiresMainQueueSetup并返回YES.我建议你不要忽略它,并返回NO,这样你就可以测试一切正常,并确保你不会有任何惊喜,当RN默认为这个在未来RN版本的情况.

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

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

dispatch_async(dispatch_get_main_queue(), ^{
    [RCTPresentedViewController() dismissViewControllerAnimated:YES completion:nil];
});
Run Code Online (Sandbox Code Playgroud)