diff --git a/packages/react-native/React/Base/RCTBridge.h b/packages/react-native/React/Base/RCTBridge.h index 23937c18548..788730bba13 100644 --- a/packages/react-native/React/Base/RCTBridge.h +++ b/packages/react-native/React/Base/RCTBridge.h @@ -77,6 +77,9 @@ void RCTSetTurboModuleInteropBridgeProxyLogLevel(RCTBridgeProxyLoggingLevel logL BOOL RCTTurboModuleInteropForAllTurboModulesEnabled(void); void RCTEnableTurboModuleInteropForAllTurboModules(BOOL enabled); +BOOL RCTBridgeModuleBatchDidCompleteDisabled(void); +void RCTDisableBridgeModuleBatchDidComplete(BOOL disabled); + typedef enum { kRCTGlobalScope, kRCTGlobalScopeUsingRetainJSCallback, diff --git a/packages/react-native/React/Base/RCTBridge.mm b/packages/react-native/React/Base/RCTBridge.mm index f576a6be6ac..9aaf79bd0b9 100644 --- a/packages/react-native/React/Base/RCTBridge.mm +++ b/packages/react-native/React/Base/RCTBridge.mm @@ -169,6 +169,17 @@ void RCTEnableTurboModuleSyncVoidMethods(BOOL enabled) gTurboModuleEnableSyncVoidMethods = enabled; } +static BOOL gBridgeModuleDisableBatchDidComplete = NO; +BOOL RCTBridgeModuleBatchDidCompleteDisabled(void) +{ + return gBridgeModuleDisableBatchDidComplete; +} + +void RCTDisableBridgeModuleBatchDidComplete(BOOL disabled) +{ + gBridgeModuleDisableBatchDidComplete = disabled; +} + BOOL kDispatchAccessibilityManagerInitOntoMain = NO; BOOL RCTUIManagerDispatchAccessibilityManagerInitOntoMain(void) { diff --git a/packages/react-native/React/Base/RCTBridgeModule.h b/packages/react-native/React/Base/RCTBridgeModule.h index a77f7abd229..9595fa3d110 100644 --- a/packages/react-native/React/Base/RCTBridgeModule.h +++ b/packages/react-native/React/Base/RCTBridgeModule.h @@ -346,7 +346,7 @@ RCT_EXTERN_C_END /** * Notifies the module that a batch of JS method invocations has just completed. */ -- (void)batchDidComplete; +- (void)batchDidComplete RCT_DEPRECATED; /** * Notifies the module that the active batch of JS method invocations has been diff --git a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm index aeece2d3be0..cce793db1d2 100644 --- a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm +++ b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm @@ -1531,15 +1531,27 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithBundleURL - (void)batchDidComplete { - // TODO #12592471: batchDidComplete is only used by RCTUIManager, - // can we eliminate this special case? - for (RCTModuleData *moduleData in _moduleDataByID) { - if (moduleData.implementsBatchDidComplete) { + if (RCTBridgeModuleBatchDidCompleteDisabled()) { + id uiManager = [self moduleForName:@"UIManager"]; + if ([uiManager respondsToSelector:@selector(batchDidComplete)] && + [uiManager respondsToSelector:@selector(methodQueue)]) { [self dispatchBlock:^{ - [moduleData.instance batchDidComplete]; + [uiManager batchDidComplete]; } - queue:moduleData.methodQueue]; + queue:[uiManager methodQueue]]; + } + } else { + // TODO #12592471: batchDidComplete is only used by RCTUIManager, + // can we eliminate this special case? + for (RCTModuleData *moduleData in _moduleDataByID) { + if (moduleData.implementsBatchDidComplete) { + [self + dispatchBlock:^{ + [moduleData.instance batchDidComplete]; + } + queue:moduleData.methodQueue]; + } } } }