虽然这两种方法都与 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];
});