Ilj*_*lja 7 objective-c ios react-native
前段时间我在这里问了类似的问题:差异需要MainQueueSetup和dispatch_get_main_queue?
我今天回来了,发现我还没完全掌握它.当我们为iOS编写反应原生模块时,dispatch_get_main_queue
ios方面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
实现,并且它告诉您确切的原因 - 模块覆盖init
该constantsToExport
方法或方法但未指定是否希望在主线程上执行它.到目前为止,默认情况下,覆盖init
或者在constantsToExport
主线程上初始化的模块,假设它们可能需要访问UI元素或UIKit
.在将来的RN版本中,这将会发生变化 - 只有在您明确说明的情况下,才会在主线程上调用这些方法.
它看起来并不像你在做什么init
或constantsToExport
需要主线程,但目前它就像你压倒一切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)
归档时间: |
|
查看次数: |
1034 次 |
最近记录: |