#import "RNNReactComponentRegistry.h" @interface RNNReactComponentRegistry () { id _creator; NSMapTable* _componentStore; } @end @implementation RNNReactComponentRegistry - (instancetype)initWithCreator:(id)creator { self = [super init]; _creator = creator; _componentStore = [NSMapTable new]; return self; } - (RNNReactView *)createComponentIfNotExists:(RNNComponentOptions *)component parentComponentId:(NSString *)parentComponentId reactViewReadyBlock:(RNNReactViewReadyCompletionBlock)reactViewReadyBlock { NSMapTable* parentComponentDict = [self componentsForParentId:parentComponentId]; RNNReactView* reactView = [parentComponentDict objectForKey:component.componentId.get]; if (!reactView) { reactView = (RNNReactView *)[_creator createRootViewFromComponentOptions:component reactViewReadyBlock:reactViewReadyBlock]; [parentComponentDict setObject:reactView forKey:component.componentId.get]; } else if (reactViewReadyBlock) { reactViewReadyBlock(); } return reactView; } - (NSMapTable *)componentsForParentId:(NSString *)parentComponentId { if (![_componentStore objectForKey:parentComponentId]) { [_componentStore setObject:[NSMapTable weakToStrongObjectsMapTable] forKey:parentComponentId];; } return [_componentStore objectForKey:parentComponentId];; } - (void)clearComponentsForParentId:(NSString *)parentComponentId { [_componentStore removeObjectForKey:parentComponentId];; } - (void)removeComponent:(NSString *)componentId { if ([_componentStore objectForKey:componentId]) { [_componentStore removeObjectForKey:componentId]; } } - (void)removeChildComponent:(NSString *)childId { NSMapTable* parent; NSEnumerator *enumerator = _componentStore.objectEnumerator; while ((parent = enumerator.nextObject)) { if ([parent objectForKey:childId]) { [parent removeObjectForKey:childId]; return; } } } - (void)clear { [_componentStore removeAllObjects]; } @end