From 6c406ffe3873db931022d6674a12f4d294fcf5e0 Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Tue, 10 Apr 2018 16:36:50 -0700 Subject: [PATCH] Fabric: RCTComponentViewRegistry Summary: A registry for components. The registry allows to refer to component view instance by react tag. It also has recycle-pool-like interface (and eventually the pool will be implemented). Reviewed By: mdvacca Differential Revision: D7507519 fbshipit-source-id: ed74203fb4d0694490b0dc23aae0aa067b3fc55b --- .../Mounting/RCTComponentViewRegistry.h | 48 +++++++++++++++ .../Mounting/RCTComponentViewRegistry.mm | 59 +++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 React/Fabric/Mounting/RCTComponentViewRegistry.h create mode 100644 React/Fabric/Mounting/RCTComponentViewRegistry.mm diff --git a/React/Fabric/Mounting/RCTComponentViewRegistry.h b/React/Fabric/Mounting/RCTComponentViewRegistry.h new file mode 100644 index 000000000..1e747b124 --- /dev/null +++ b/React/Fabric/Mounting/RCTComponentViewRegistry.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Registry of native component views. + * Provides basic functionality for allocation, recycling, and querying (by tag) native view instances. + */ +@interface RCTComponentViewRegistry : NSObject + +/** + * Returns a native view instance from the recycle pool (or create) + * for given `componentName` and with given `tag`. + * #RefuseSingleUse + */ +- (UIView *)dequeueComponentViewWithName:(NSString *)componentName + tag:(ReactTag)tag; + +/** + * Puts a given native component view to the recycle pool. + * #RefuseSingleUse + */ +- (void)enqueueComponentViewWithName:(NSString *)componentName + tag:(ReactTag)tag + componentView:(UIView *)componentView; + +/** + * Returns a native component view by given `tag`. + */ +- (UIView *)componentViewByTag:(ReactTag)tag; + +/** + * Returns `tag` assosiated with given `componentView`. + */ +- (ReactTag)tagByComponentView:(UIView *)componentView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/React/Fabric/Mounting/RCTComponentViewRegistry.mm b/React/Fabric/Mounting/RCTComponentViewRegistry.mm new file mode 100644 index 000000000..c9d822400 --- /dev/null +++ b/React/Fabric/Mounting/RCTComponentViewRegistry.mm @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTComponentViewRegistry.h" + +#import +#import + +@implementation RCTComponentViewRegistry { + NSMapTable *> *_registry; +} + +- (instancetype)init +{ + if (self = [super init]) { + _registry = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsIntegerPersonality | NSPointerFunctionsOpaqueMemory + valueOptions:NSPointerFunctionsObjectPersonality]; + } + + return self; +} + +- (UIView *)dequeueComponentViewWithName:(NSString *)componentName + tag:(ReactTag)tag +{ + RCTAssertMainQueue(); + // This is temporary approach. + NSString *className = [NSString stringWithFormat:@"RCT%@ComponentView", componentName]; + UIView *componentView = [[NSClassFromString(className) alloc] init]; + componentView.tag = tag; + [_registry setObject:componentView forKey:(__bridge id)(void *)tag]; + return componentView; +} + +- (void)enqueueComponentViewWithName:(NSString *)componentName + tag:(ReactTag)tag + componentView:(UIView *)componentView +{ + RCTAssertMainQueue(); + [_registry removeObjectForKey:(__bridge id)(void *)tag]; +} + +- (UIView *)componentViewByTag:(ReactTag)tag +{ + RCTAssertMainQueue(); + return [_registry objectForKey:(__bridge id)(void *)tag]; +} + +- (ReactTag)tagByComponentView:(UIView *)componentView +{ + RCTAssertMainQueue(); + return componentView.tag; +} + +@end