From 466571015f3dcbe62653694eff7dd1308267d991 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Wed, 7 Feb 2024 07:05:34 -0800 Subject: [PATCH] Fix warning when loading RCTUIManager and A11yManager (#42733) Summary: When we fixed the race condition between A11yManager and RCTUIManager, we did it by moving the A11yManager on a background queue. In the old architecture, this was raising a warning which our users might find confusing. Plus, that change was not aligned with what the A11yManager declared in its configuration because we are actually initializing it starting from a BG queue. {F1405693310} With this change we anticipate the initialization of the module in a place where: 1. We know we are in the main queue 2. We know we are going to need it (so it is not violating the lazy load principle) 3. We know it is safe. This should allow us to also remove the feature flag of `RCTUIManagerDispatchAccessibilityManagerInitOntoMain` because now it is safe to use the main_queue as requested by the module. ## Changelog: [iOS][Fixed] - Initialize the A11yManager in the main queue and when we need it. Reviewed By: philIip Differential Revision: D53225120 --- packages/react-native/React/Modules/RCTUIManager.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/react-native/React/Modules/RCTUIManager.m b/packages/react-native/React/Modules/RCTUIManager.m index fca5ee7aa900..1d85520d0a4a 100644 --- a/packages/react-native/React/Modules/RCTUIManager.m +++ b/packages/react-native/React/Modules/RCTUIManager.m @@ -180,6 +180,12 @@ - (void)setBridge:(RCTBridge *)bridge } } + // Preload the a11yManager as the RCTUIManager needs it to listen for notification + // By eagerly preloading it in the setBridge method, we make sure that the manager is + // properly initialized in the Main Thread and that we do not incur in any race condition + // or concurrency problem. + id a11yManager = [bridge moduleForName:@"AccessibilityManager" lazilyLoadIfNecessary:YES]; + // This dispatch_async avoids a deadlock while configuring native modules dispatch_queue_t accessibilityManagerInitQueue = RCTUIManagerDispatchAccessibilityManagerInitOntoMain() ? dispatch_get_main_queue() @@ -188,8 +194,7 @@ - (void)setBridge:(RCTBridge *)bridge [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNewContentSizeMultiplier) name:@"RCTAccessibilityManagerDidUpdateMultiplierNotification" - object:[self->_bridge moduleForName:@"AccessibilityManager" - lazilyLoadIfNecessary:YES]]; + object:a11yManager]; }); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(namedOrientationDidChange)