forked from facebook/react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Summary: The whole mounting iOS infra now uses `ComponentHandle` instead of `std::string` as a reference to particular `ComponentView` implementation. All changes are pretty straightforward, we use a different thing/type to refer to the particular class; no changes in the logic besides a new `RCTComponentViewFactory` that serves the same role of classes registry as Objective-C runtime served previously. That has several benefits: * It should be slightly faster, mostly because we don't need to convert `char *` strings to `std::string` and then to `NSString *`. * We don't need string-based component-name maps anymore (at least on this layer). We can call classes as we want and it will work because of classes are now explicit about which ShadowNodes they are compatible with. * Most importantly, it's explicit now! That means that no runtime magic is involved anymore and we can rely on static linting tool now and not be afraid of improper code stripping/overoptimization. Reviewed By: mdvacca Differential Revision: D13130760 fbshipit-source-id: aadf70525a1335b96992443abae4da359efdc829
- Loading branch information
1 parent
eef3df8
commit e581977
Showing
14 changed files
with
186 additions
and
66 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
#import <UIKit/UIKit.h> | ||
|
||
#import <React/RCTComponentViewProtocol.h> | ||
|
||
NS_ASSUME_NONNULL_BEGIN | ||
|
||
/** | ||
* Registry of supported component view classes that can instantiate | ||
* view component instances by given component handle. | ||
*/ | ||
@interface RCTComponentViewFactory : NSObject | ||
|
||
/** | ||
* Constructs and returns an instance of the class with a bunch of already registered standard components. | ||
*/ | ||
+ (RCTComponentViewFactory *)standardComponentViewFactory; | ||
|
||
/** | ||
* Registers a component view class in the factory. | ||
*/ | ||
- (void)registerComponentViewClass:(Class<RCTComponentViewProtocol>)componentViewClass; | ||
|
||
/** | ||
* Creates a component view with given component handle. | ||
*/ | ||
- (UIView<RCTComponentViewProtocol> *)createComponentViewWithComponentHandle:(facebook::react::ComponentHandle)componentHandle; | ||
|
||
@end | ||
|
||
NS_ASSUME_NONNULL_END |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
#import "RCTComponentViewFactory.h" | ||
|
||
#import <React/RCTAssert.h> | ||
#import <react/core/ReactPrimitives.h> | ||
|
||
#import "RCTViewComponentView.h" | ||
#import "RCTImageComponentView.h" | ||
#import "RCTScrollViewComponentView.h" | ||
#import "RCTParagraphComponentView.h" | ||
#import "RCTRootComponentView.h" | ||
#import "RCTActivityIndicatorViewComponentView.h" | ||
#import "RCTSwitchComponentView.h" | ||
|
||
using namespace facebook::react; | ||
|
||
@implementation RCTComponentViewFactory | ||
{ | ||
std::unordered_map<ComponentHandle, Class<RCTComponentViewProtocol>> _registry; | ||
} | ||
|
||
+ (RCTComponentViewFactory *)standardComponentViewFactory | ||
{ | ||
RCTAssertMainQueue(); | ||
|
||
RCTComponentViewFactory *componentViewFactory = [[RCTComponentViewFactory alloc] init]; | ||
|
||
[componentViewFactory registerComponentViewClass:[RCTViewComponentView class]]; | ||
[componentViewFactory registerComponentViewClass:[RCTRootComponentView class]]; | ||
[componentViewFactory registerComponentViewClass:[RCTScrollViewComponentView class]]; | ||
[componentViewFactory registerComponentViewClass:[RCTImageComponentView class]]; | ||
[componentViewFactory registerComponentViewClass:[RCTParagraphComponentView class]]; | ||
[componentViewFactory registerComponentViewClass:[RCTActivityIndicatorViewComponentView class]]; | ||
[componentViewFactory registerComponentViewClass:[RCTSwitchComponentView class]]; | ||
|
||
return componentViewFactory; | ||
} | ||
|
||
- (void)registerComponentViewClass:(Class<RCTComponentViewProtocol>)componentViewClass | ||
{ | ||
RCTAssertMainQueue(); | ||
|
||
ComponentHandle componentHandle = [componentViewClass componentHandle]; | ||
_registry[componentHandle] = componentViewClass; | ||
} | ||
|
||
- (UIView<RCTComponentViewProtocol> *)createComponentViewWithComponentHandle:(facebook::react::ComponentHandle)componentHandle | ||
{ | ||
RCTAssertMainQueue(); | ||
|
||
auto iterator = _registry.find(componentHandle); | ||
RCTAssert( | ||
iterator != _registry.end(), | ||
@"ComponentView with componentHandle `%lli` (`%s`) not found.", componentHandle, (char *)componentHandle); | ||
Class componentViewClass = iterator->second; | ||
return [[componentViewClass alloc] init]; | ||
} | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.