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