From b263560c73af5559fdc3bba411f16c588abbffef Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Mon, 18 Dec 2017 11:43:35 -0800 Subject: [PATCH] reactBridgeDidFinishTransaction was removed from RCTTabBar 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: D6549586 fbshipit-source-id: 589b814f83b91ed8fabf7e638e7554ab3c9d286e --- React/Views/RCTTabBar.h | 2 ++ React/Views/RCTTabBar.m | 4 ++-- React/Views/RCTTabBarManager.m | 41 +++++++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/React/Views/RCTTabBar.h b/React/Views/RCTTabBar.h index 5f866a27ba51dc..d2f1c1e7a5de0e 100644 --- a/React/Views/RCTTabBar.h +++ b/React/Views/RCTTabBar.h @@ -19,4 +19,6 @@ @property (nonatomic, assign) UIBarStyle barStyle; #endif +- (void)uiManagerDidPerformMounting; + @end diff --git a/React/Views/RCTTabBar.m b/React/Views/RCTTabBar.m index 1f6d29d7a090b7..f9d297d567dfeb 100644 --- a/React/Views/RCTTabBar.m +++ b/React/Views/RCTTabBar.m @@ -73,7 +73,7 @@ - (void)removeReactSubview:(RCTTabBarItem *)subview - (void)didUpdateReactSubviews { - // Do nothing, as subviews are managed by `reactBridgeDidFinishTransaction` + // Do nothing, as subviews are managed by `uiManagerDidPerformMounting` } - (void)layoutSubviews @@ -83,7 +83,7 @@ - (void)layoutSubviews _tabController.view.frame = self.bounds; } -- (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 whenever a transaction has finished diff --git a/React/Views/RCTTabBarManager.m b/React/Views/RCTTabBarManager.m index 471a875979021d..f8e98854d05590 100644 --- a/React/Views/RCTTabBarManager.m +++ b/React/Views/RCTTabBarManager.m @@ -11,6 +11,8 @@ #import "RCTBridge.h" #import "RCTTabBar.h" +#import "RCTUIManager.h" +#import "RCTUIManagerObserverCoordinator.h" @implementation RCTConvert (UITabBar) @@ -22,13 +24,39 @@ @implementation RCTConvert (UITabBar) @end +@interface RCTTabBarManager () + +@end + @implementation RCTTabBarManager +{ + // The main thread only. + NSHashTable *_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 [RCTTabBar new]; + if (!_viewRegistry) { + _viewRegistry = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]; + } + + RCTTabBar *view = [RCTTabBar new]; + [_viewRegistry addObject:view]; + return view; } RCT_EXPORT_VIEW_PROPERTY(unselectedTintColor, UIColor) @@ -41,4 +69,15 @@ - (UIView *)view RCT_EXPORT_VIEW_PROPERTY(itemPositioning, UITabBarItemPositioning) RCT_EXPORT_VIEW_PROPERTY(unselectedItemTintColor, UIColor) +#pragma mark - RCTUIManagerObserver + +- (void)uiManagerDidPerformMounting:(__unused RCTUIManager *)manager +{ + RCTExecuteOnMainQueue(^{ + for (RCTTabBar *view in self->_viewRegistry) { + [view uiManagerDidPerformMounting]; + } + }); +} + @end