diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm index 9a34ab1ab7d3..6599c1295fe5 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm @@ -178,6 +178,11 @@ static Class getFallbackClassFromName(const char *name) return moduleClass; } +typedef struct { + id module; + dispatch_queue_t methodQueue; +} ModuleQueuePair; + @implementation RCTTurboModuleManager { std::shared_ptr _jsInvoker; __weak id _delegate; @@ -1033,7 +1038,7 @@ - (void)_invalidateModules { // Backward-compatibility: RCTInvalidating handling. dispatch_group_t moduleInvalidationGroup = dispatch_group_create(); - + std::vector modulesToInvalidate; for (auto &pair : _moduleHolders) { std::string moduleName = pair.first; ModuleHolder *moduleHolder = &pair.second; @@ -1056,22 +1061,31 @@ - (void)_invalidateModules [module class]); continue; } + modulesToInvalidate.push_back({module, methodQueue}); + } + } - dispatch_group_enter(moduleInvalidationGroup); - dispatch_block_t invalidateModule = ^{ - [((id)module) invalidate]; - dispatch_group_leave(moduleInvalidationGroup); - }; + for (auto unused : modulesToInvalidate) { + dispatch_group_enter(moduleInvalidationGroup); + } - if (_bridge) { - [_bridge dispatchBlock:invalidateModule queue:methodQueue]; + for (auto &moduleQueuePair : modulesToInvalidate) { + id module = moduleQueuePair.module; + dispatch_queue_t methodQueue = moduleQueuePair.methodQueue; + + dispatch_block_t invalidateModule = ^{ + [((id)module) invalidate]; + dispatch_group_leave(moduleInvalidationGroup); + }; + + if (_bridge) { + [_bridge dispatchBlock:invalidateModule queue:methodQueue]; + } else { + // Bridgeless mode + if (methodQueue == RCTJSThread) { + invalidateModule(); } else { - // Bridgeless mode - if (methodQueue == RCTJSThread) { - invalidateModule(); - } else { - dispatch_async(methodQueue, invalidateModule); - } + dispatch_async(methodQueue, invalidateModule); } } }