Permalink
Browse files

`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
  • Loading branch information...
shergin authored and facebook-github-bot committed Dec 18, 2017
1 parent b8e60a3 commit 099b28006b59abb11eae1f27424566b280860b0d
Showing with 43 additions and 3 deletions.
  1. +2 −0 React/Views/RCTNavigator.h
  2. +2 −2 React/Views/RCTNavigator.m
  3. +39 −1 React/Views/RCTNavigatorManager.m
@@ -31,4 +31,6 @@
*/
- (BOOL)requestSchedulingJavaScriptNavigation;

- (void)uiManagerDidPerformMounting;

@end
@@ -466,7 +466,7 @@ - (void)insertReactSubview:(RCTNavItem *)view atIndex:(NSInteger)atIndex

- (void)didUpdateReactSubviews
{
// Do nothing, as subviews are managed by `reactBridgeDidFinishTransaction`
// Do nothing, as subviews are managed by `uiManagerDidPerformMounting`
}

- (void)layoutSubviews
@@ -510,7 +510,7 @@ - (UIView *)reactSuperview
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 @@ - (UIView *)view
}];
}

#pragma mark - RCTUIManagerObserver

- (void)uiManagerDidPerformMounting:(__unused RCTUIManager *)manager
{
RCTExecuteOnMainQueue(^{
for (RCTNavigator *view in self->_viewRegistry) {
[view uiManagerDidPerformMounting];
}
});
}

@end

0 comments on commit 099b280

Please sign in to comment.