From e46ea8c7375a8d12778d18bc263f654bd49269ec Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Sun, 7 Jan 2018 21:24:48 -0800 Subject: [PATCH] Refined -[RCTUIManager createView:] Summary: Now we do not add newly created view to the registry at the preluminary step. Reviewed By: mmmulani Differential Revision: D6641403 fbshipit-source-id: c69077aaba871f3cdb3500c75e1efe07546e1b7f --- React/Modules/RCTUIManager.m | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/React/Modules/RCTUIManager.m b/React/Modules/RCTUIManager.m index 4cefa9157..61740280b 100644 --- a/React/Modules/RCTUIManager.m +++ b/React/Modules/RCTUIManager.m @@ -967,21 +967,19 @@ RCT_EXPORT_METHOD(createView:(nonnull NSNumber *)reactTag // Dispatch view creation directly to the main thread instead of adding to // UIBlocks array. This way, it doesn't get deferred until after layout. - __weak RCTUIManager *weakManager = self; + __block UIView *preliminaryCreatedView; + RCTExecuteOnMainQueue(^{ - RCTUIManager *uiManager = weakManager; - if (!uiManager) { - return; - } - UIView *view = [componentData createViewWithTag:reactTag]; - if (view) { - uiManager->_viewRegistry[reactTag] = view; - } + preliminaryCreatedView = [componentData createViewWithTag:reactTag]; }); - [self addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { - UIView *view = viewRegistry[reactTag]; - [componentData setProps:props forView:view]; + [self addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { + if (!preliminaryCreatedView) { + return; + } + + uiManager->_viewRegistry[reactTag] = preliminaryCreatedView; + [componentData setProps:props forView:preliminaryCreatedView]; }]; [self _shadowView:shadowView didReceiveUpdatedProps:[props allKeys]];