fix: implement RCTAppearanceProxy #2729
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary:
React Native primarily runs on 2 threads: the UI thread (main thread for apple) and the JS thread (where the Javascript engine is running). This poses a challenge when JS synchronously wants a value that can only be accessed on the main thread (
getColorScheme()
is the issue in this case).React Native upstream solves this via proxy objects (all initialized in
RCTInitializeUIKitProxies()
called on RN instance startup) that set an initial value, and then guard reading / setting updated values of the main-thead-only values we want.Lets implement that for NSAppearance so we can fix a bunch of main thread violations we've been seeing on boot. I chose not to ifdef
RCTTraitCollectionProxy
because the names are quite different.. althought that would be the right file.Test Plan:
No main thread checker violations on RNTester boot.