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
This commit is contained in:
Valentin Shergin 2018-04-10 16:36:50 -07:00 committed by Facebook Github Bot
parent 11833714d9
commit 6c406ffe38
2 changed files with 107 additions and 0 deletions

View File

@ -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 <UIKit/UIKit.h>
#import <React/RCTComponentViewProtocol.h>
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<RCTComponentViewProtocol> *)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<RCTComponentViewProtocol> *)componentView;
/**
* Returns a native component view by given `tag`.
*/
- (UIView<RCTComponentViewProtocol> *)componentViewByTag:(ReactTag)tag;
/**
* Returns `tag` assosiated with given `componentView`.
*/
- (ReactTag)tagByComponentView:(UIView<RCTComponentViewProtocol> *)componentView;
@end
NS_ASSUME_NONNULL_END

View File

@ -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 <Foundation/NSMapTable.h>
#import <React/RCTAssert.h>
@implementation RCTComponentViewRegistry {
NSMapTable<id, UIView<RCTComponentViewProtocol> *> *_registry;
}
- (instancetype)init
{
if (self = [super init]) {
_registry = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsIntegerPersonality | NSPointerFunctionsOpaqueMemory
valueOptions:NSPointerFunctionsObjectPersonality];
}
return self;
}
- (UIView<RCTComponentViewProtocol> *)dequeueComponentViewWithName:(NSString *)componentName
tag:(ReactTag)tag
{
RCTAssertMainQueue();
// This is temporary approach.
NSString *className = [NSString stringWithFormat:@"RCT%@ComponentView", componentName];
UIView<RCTComponentViewProtocol> *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<RCTComponentViewProtocol> *)componentView
{
RCTAssertMainQueue();
[_registry removeObjectForKey:(__bridge id)(void *)tag];
}
- (UIView<RCTComponentViewProtocol> *)componentViewByTag:(ReactTag)tag
{
RCTAssertMainQueue();
return [_registry objectForKey:(__bridge id)(void *)tag];
}
- (ReactTag)tagByComponentView:(UIView<RCTComponentViewProtocol> *)componentView
{
RCTAssertMainQueue();
return componentView.tag;
}
@end