`reactBridgeDidFinishTransaction` was removed from RCTNavigator
Summary: We are removing `reactBridgeDidFinishTransaction`. Why? * It is a performance drain. Supporting this requires dispatching main-thread block on every single transaction complete; * It has "too broad" non-conceptual semantic which encouraged using this as a "band-aid solution" for poorly designed components; * It is conceptually incompatible with new approaches that we are trying to implement to optimize the render layer; * It was deprecated for very long time. This diff replaces usage of `reactBridgeDidFinishTransaction` with `uiManagerDidPerformMounting` which has very similar semantic except that fact that `uiManagerDidPerformMounting` is called asynchronously on the next run loop tick. And this should be okay because new React partial rendering does not guarantee synchronous execution anyways. Reviewed By: mmmulani Differential Revision: D6549217 fbshipit-source-id: 2649e943e82e6fbe02c7678583a97db3f5800201
This commit is contained in:
parent
b8e60a3ca3
commit
099b28006b
|
@ -31,4 +31,6 @@
|
|||
*/
|
||||
- (BOOL)requestSchedulingJavaScriptNavigation;
|
||||
|
||||
- (void)uiManagerDidPerformMounting;
|
||||
|
||||
@end
|
||||
|
|
|
@ -466,7 +466,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
|||
|
||||
- (void)didUpdateReactSubviews
|
||||
{
|
||||
// Do nothing, as subviews are managed by `reactBridgeDidFinishTransaction`
|
||||
// Do nothing, as subviews are managed by `uiManagerDidPerformMounting`
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
|
@ -510,7 +510,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
|||
return superview ?: self.reactNavSuperviewLink;
|
||||
}
|
||||
|
||||
- (void)reactBridgeDidFinishTransaction
|
||||
- (void)uiManagerDidPerformMounting
|
||||
{
|
||||
// we can't hook up the VC hierarchy in 'init' because the subviews aren't
|
||||
// hooked up yet, so we do it on demand here
|
||||
|
|
|
@ -13,15 +13,42 @@
|
|||
#import "RCTConvert.h"
|
||||
#import "RCTNavigator.h"
|
||||
#import "RCTUIManager.h"
|
||||
#import "RCTUIManagerObserverCoordinator.h"
|
||||
#import "UIView+React.h"
|
||||
|
||||
@interface RCTNavigatorManager () <RCTUIManagerObserver>
|
||||
|
||||
@end
|
||||
|
||||
@implementation RCTNavigatorManager
|
||||
{
|
||||
// The main thread only.
|
||||
NSHashTable<RCTNavigator *> *_viewRegistry;
|
||||
}
|
||||
|
||||
- (void)setBridge:(RCTBridge *)bridge
|
||||
{
|
||||
[super setBridge:bridge];
|
||||
|
||||
[self.bridge.uiManager.observerCoordinator addObserver:self];
|
||||
}
|
||||
|
||||
- (void)invalidate
|
||||
{
|
||||
[self.bridge.uiManager.observerCoordinator removeObserver:self];
|
||||
}
|
||||
|
||||
RCT_EXPORT_MODULE()
|
||||
|
||||
- (UIView *)view
|
||||
{
|
||||
return [[RCTNavigator alloc] initWithBridge:self.bridge];
|
||||
if (!_viewRegistry) {
|
||||
_viewRegistry = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory];
|
||||
}
|
||||
|
||||
RCTNavigator *view = [[RCTNavigator alloc] initWithBridge:self.bridge];
|
||||
[_viewRegistry addObject:view];
|
||||
return view;
|
||||
}
|
||||
|
||||
RCT_EXPORT_VIEW_PROPERTY(requestedTopOfStack, NSInteger)
|
||||
|
@ -44,4 +71,15 @@ RCT_EXPORT_METHOD(requestSchedulingJavaScriptNavigation:(nonnull NSNumber *)reac
|
|||
}];
|
||||
}
|
||||
|
||||
#pragma mark - RCTUIManagerObserver
|
||||
|
||||
- (void)uiManagerDidPerformMounting:(__unused RCTUIManager *)manager
|
||||
{
|
||||
RCTExecuteOnMainQueue(^{
|
||||
for (RCTNavigator *view in self->_viewRegistry) {
|
||||
[view uiManagerDidPerformMounting];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue