Skip to content

Commit

Permalink
Fix warning when loading RCTUIManager and A11yManager (facebook#42733)
Browse files Browse the repository at this point in the history
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.

Differential Revision: D53225120
  • Loading branch information
cipolleschi authored and facebook-github-bot committed Jan 31, 2024
1 parent 82e9a5e commit ab64345
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions packages/react-native/React/Modules/RCTUIManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -180,16 +180,23 @@ - (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<RCTBridgeModule> a11yManager = [self->_bridge moduleForName:@"AccessibilityManager" lazilyLoadIfNecessary:YES];
__weak NSObject *a11yManagerWeakObject = a11yManager;

// This dispatch_async avoids a deadlock while configuring native modules
dispatch_queue_t accessibilityManagerInitQueue = RCTUIManagerDispatchAccessibilityManagerInitOntoMain()
? dispatch_get_main_queue()
: dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0);
dispatch_async(accessibilityManagerInitQueue, ^{
__strong NSObject *a11yManagerStrongObject = a11yManagerWeakObject;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didReceiveNewContentSizeMultiplier)
name:@"RCTAccessibilityManagerDidUpdateMultiplierNotification"
object:[self->_bridge moduleForName:@"AccessibilityManager"
lazilyLoadIfNecessary:YES]];
object:a11yManagerStrongObject];
});
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(namedOrientationDidChange)
Expand Down

0 comments on commit ab64345

Please sign in to comment.