Refactor RCTTurboModuleManager to take in a CallInvoker

Summary:
In bridgeless mode, `RCTTurboModuleManager` is initialized with a nil bridge. This has mostly worked, since `RCTBridge` doesn't do too many things for TMM (some notifs and perf markers). The one important thing it provides is a `_jsInvoker`.

In bridgeless mode, up until this point `_jsInvoker` has been nil, and turbo modules were not able to call functions on the JS thread. This diff fixes that.

Reviewed By: RSNara

Differential Revision: D19437174

fbshipit-source-id: 86bfc0a47bd9576e7d3203b860e86446eb0b63dd
This commit is contained in:
Peter Argany 2020-01-17 15:53:23 -08:00 коммит произвёл Facebook Github Bot
Родитель dd476d0506
Коммит 459c54c407
3 изменённых файлов: 21 добавлений и 18 удалений

Просмотреть файл

@ -21,6 +21,7 @@
#import <React/RCTDataRequestHandler.h>
#import <React/RCTFileRequestHandler.h>
#import <React/RCTRootView.h>
#import <ReactCommon/BridgeJSCallInvoker.h>
#import <cxxreact/JSExecutor.h>
@ -114,7 +115,9 @@
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
{
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge delegate:self];
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
delegate:self
jsInvoker:std::make_shared<facebook::react::BridgeJSCallInvoker>(bridge.reactInstance)];
__weak __typeof(self) weakSelf = self;
return std::make_unique<facebook::react::JSCExecutorFactory>([weakSelf, bridge](facebook::jsi::Runtime &runtime) {
if (!bridge) {

Просмотреть файл

@ -38,7 +38,9 @@
@interface RCTTurboModuleManager : NSObject <RCTTurboModuleLookupDelegate>
- (instancetype)initWithBridge:(RCTBridge *)bridge delegate:(id<RCTTurboModuleManagerDelegate>)delegate;
- (instancetype)initWithBridge:(RCTBridge *)bridge
delegate:(id<RCTTurboModuleManagerDelegate>)delegate
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker;
- (void)installJSBindingWithRuntime:(facebook::jsi::Runtime *)runtime;

Просмотреть файл

@ -17,7 +17,6 @@
#import <React/RCTLog.h>
#import <React/RCTModuleData.h>
#import <React/RCTPerformanceLogger.h>
#import <ReactCommon/BridgeJSCallInvoker.h>
#import <ReactCommon/TurboCxxModule.h>
#import <ReactCommon/TurboModuleBinding.h>
@ -63,10 +62,12 @@ static Class getFallbackClassFromName(const char *name)
std::atomic<bool> _invalidating;
}
- (instancetype)initWithBridge:(RCTBridge *)bridge delegate:(id<RCTTurboModuleManagerDelegate>)delegate
- (instancetype)initWithBridge:(RCTBridge *)bridge
delegate:(id<RCTTurboModuleManagerDelegate>)delegate
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
if (self = [super init]) {
_jsInvoker = std::make_shared<react::BridgeJSCallInvoker>(bridge.reactInstance);
_jsInvoker = jsInvoker;
_delegate = delegate;
_bridge = bridge;
_invalidating = false;
@ -353,10 +354,7 @@ static Class getFallbackClassFromName(const char *name)
[[NSNotificationCenter defaultCenter]
postNotificationName:RCTDidInitializeModuleNotification
object:strongBridge
userInfo:@{
@"module" : module,
@"bridge" : RCTNullIfNil([strongBridge parentBridge])
}];
userInfo:@{@"module" : module, @"bridge" : RCTNullIfNil([strongBridge parentBridge])}];
};
if ([[module class] respondsToSelector:@selector(requiresMainQueueSetup)] &&
@ -445,11 +443,11 @@ static Class getFallbackClassFromName(const char *name)
if (methodQueue) {
dispatch_group_enter(moduleInvalidationGroup);
[bridge
dispatchBlock:^{
[((id<RCTInvalidating>)module) invalidate];
dispatch_group_leave(moduleInvalidationGroup);
}
queue:methodQueue];
dispatchBlock:^{
[((id<RCTInvalidating>)module) invalidate];
dispatch_group_leave(moduleInvalidationGroup);
}
queue:methodQueue];
continue;
}
}
@ -481,10 +479,10 @@ static Class getFallbackClassFromName(const char *name)
// Backward-compatibility: RCTInvalidating handling, but not adhering to desired methodQueue.
for (const auto &p : rctCacheCopy) {
id<RCTTurboModule> module = p.second;
if ([module respondsToSelector:@selector(invalidate)]) {
[((id<RCTInvalidating>)module) invalidate];
}
id<RCTTurboModule> module = p.second;
if ([module respondsToSelector:@selector(invalidate)]) {
[((id<RCTInvalidating>)module) invalidate];
}
}
{