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:
parent
11833714d9
commit
6c406ffe38
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue