Fabric: Introducing `RCTComponentViewClassDescriptor`
Summary: RCTComponentViewClassDescriptor is a pretty much the same as RCTComponentViewDescriptor but for *classes*. RCTComponentViewFactory uses a map of those data structures to create RCTComponentViewDescriptor instances (which reflects the same properties) efficiently. Changelog: [Internal] Fabric-specific internal change. Reviewed By: sammy-SC Differential Revision: D18217103 fbshipit-source-id: ab7ab6b0712048d0085b61a3604b284b1fb5a68b
This commit is contained in:
Родитель
93ded152d9
Коммит
c583822504
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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
|
||||
|
||||
/*
|
||||
* Holds a native view class and a set of attributes associated with it.
|
||||
*/
|
||||
class RCTComponentViewClassDescriptor final {
|
||||
public:
|
||||
/*
|
||||
* Associated (and owned) native view class.
|
||||
*/
|
||||
Class<RCTComponentViewProtocol> viewClass;
|
||||
};
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#import "RCTARTSurfaceViewComponentView.h"
|
||||
#import "RCTActivityIndicatorViewComponentView.h"
|
||||
#import "RCTComponentViewClassDescriptor.h"
|
||||
#import "RCTImageComponentView.h"
|
||||
#import "RCTLegacyViewManagerInteropComponentView.h"
|
||||
#import "RCTModalHostViewComponentView.h"
|
||||
|
@ -33,7 +34,7 @@
|
|||
using namespace facebook::react;
|
||||
|
||||
@implementation RCTComponentViewFactory {
|
||||
better::map<ComponentHandle, Class<RCTComponentViewProtocol>> _componentViewClasses;
|
||||
better::map<ComponentHandle, RCTComponentViewClassDescriptor> _componentViewClasses;
|
||||
ComponentDescriptorProviderRegistry _providerRegistry;
|
||||
better::shared_mutex _mutex;
|
||||
}
|
||||
|
@ -68,19 +69,26 @@ using namespace facebook::react;
|
|||
|
||||
providerRegistry->add(ComponentDescriptorProvider{componentHandle, componentName, flavor, constructor});
|
||||
|
||||
componentViewFactory->_componentViewClasses[componentHandle] = [RCTLegacyViewManagerInteropComponentView class];
|
||||
componentViewFactory->_componentViewClasses[componentHandle] = [componentViewFactory
|
||||
_componentViewClassDescriptorFromClass:[RCTLegacyViewManagerInteropComponentView class]];
|
||||
}
|
||||
});
|
||||
|
||||
return componentViewFactory;
|
||||
}
|
||||
|
||||
- (RCTComponentViewClassDescriptor)_componentViewClassDescriptorFromClass:(Class<RCTComponentViewProtocol>)viewClass
|
||||
{
|
||||
return RCTComponentViewClassDescriptor{.viewClass = viewClass};
|
||||
}
|
||||
|
||||
- (void)registerComponentViewClass:(Class<RCTComponentViewProtocol>)componentViewClass
|
||||
{
|
||||
std::unique_lock<better::shared_mutex> lock(_mutex);
|
||||
|
||||
auto componentDescriptorProvider = [componentViewClass componentDescriptorProvider];
|
||||
_componentViewClasses[componentDescriptorProvider.handle] = componentViewClass;
|
||||
_componentViewClasses[componentDescriptorProvider.handle] =
|
||||
[self _componentViewClassDescriptorFromClass:componentViewClass];
|
||||
_providerRegistry.add(componentDescriptorProvider);
|
||||
|
||||
auto supplementalComponentDescriptorProviders = [componentViewClass supplementalComponentDescriptorProviders];
|
||||
|
@ -109,9 +117,10 @@ using namespace facebook::react;
|
|||
@"ComponentView with componentHandle `%lli` (`%s`) not found.",
|
||||
componentHandle,
|
||||
(char *)componentHandle);
|
||||
Class componentViewClass = iterator->second;
|
||||
auto componentViewClassDescriptor = iterator->second;
|
||||
Class viewClass = componentViewClassDescriptor.viewClass;
|
||||
|
||||
return RCTComponentViewDescriptor{.view = [[componentViewClass alloc] init]};
|
||||
return RCTComponentViewDescriptor{.view = [[viewClass alloc] init]};
|
||||
}
|
||||
|
||||
- (facebook::react::ComponentDescriptorRegistry::Shared)createComponentDescriptorRegistryWithParameters:
|
||||
|
|
Загрузка…
Ссылка в новой задаче