mirror of
https://github.com/status-im/react-native.git
synced 2025-01-09 09:12:02 +00:00
402ae2f01f
Summary: In some embedding/interop cases (RN inside, something else outside), the interop layer has to have the ability to control (intercept, delay, perform synchronously with another stuff) mounting process. This API allows doing that. Reviewed By: fkgozali Differential Revision: D7014179 fbshipit-source-id: 04036095f7e60a5ff7e69025ff6066fea92eb361
102 lines
2.5 KiB
Plaintext
102 lines
2.5 KiB
Plaintext
/**
|
|
* 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 "RCTUIManagerObserverCoordinator.h"
|
|
|
|
#import <mutex>
|
|
|
|
#import "RCTUIManager.h"
|
|
|
|
@implementation RCTUIManagerObserverCoordinator {
|
|
NSHashTable<id<RCTUIManagerObserver>> *_observers;
|
|
std::mutex _mutex;
|
|
}
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (self = [super init]) {
|
|
_observers = [[NSHashTable alloc] initWithOptions:NSHashTableWeakMemory capacity:0];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)addObserver:(id<RCTUIManagerObserver>)observer
|
|
{
|
|
std::lock_guard<std::mutex> lock(_mutex);
|
|
[self->_observers addObject:observer];
|
|
}
|
|
|
|
- (void)removeObserver:(id<RCTUIManagerObserver>)observer
|
|
{
|
|
std::lock_guard<std::mutex> lock(_mutex);
|
|
[self->_observers removeObject:observer];
|
|
}
|
|
|
|
#pragma mark - RCTUIManagerObserver
|
|
|
|
- (void)uiManagerWillPerformLayout:(RCTUIManager *)manager
|
|
{
|
|
std::lock_guard<std::mutex> lock(_mutex);
|
|
|
|
for (id<RCTUIManagerObserver> observer in _observers) {
|
|
if ([observer respondsToSelector:@selector(uiManagerWillPerformLayout:)]) {
|
|
[observer uiManagerWillPerformLayout:manager];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)uiManagerDidPerformLayout:(RCTUIManager *)manager
|
|
{
|
|
std::lock_guard<std::mutex> lock(_mutex);
|
|
|
|
for (id<RCTUIManagerObserver> observer in _observers) {
|
|
if ([observer respondsToSelector:@selector(uiManagerDidPerformLayout:)]) {
|
|
[observer uiManagerDidPerformLayout:manager];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)uiManagerWillPerformMounting:(RCTUIManager *)manager
|
|
{
|
|
std::lock_guard<std::mutex> lock(_mutex);
|
|
|
|
for (id<RCTUIManagerObserver> observer in _observers) {
|
|
if ([observer respondsToSelector:@selector(uiManagerWillPerformMounting:)]) {
|
|
[observer uiManagerWillPerformMounting:manager];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (BOOL)uiManager:(RCTUIManager *)manager performMountingWithBlock:(RCTUIManagerMountingBlock)block
|
|
{
|
|
std::lock_guard<std::mutex> lock(_mutex);
|
|
|
|
for (id<RCTUIManagerObserver> observer in _observers) {
|
|
if ([observer respondsToSelector:@selector(uiManager:performMountingWithBlock:)]) {
|
|
if ([observer uiManager:manager performMountingWithBlock:block]) {
|
|
return YES;
|
|
}
|
|
}
|
|
}
|
|
return NO;
|
|
}
|
|
|
|
- (void)uiManagerDidPerformMounting:(RCTUIManager *)manager
|
|
{
|
|
std::lock_guard<std::mutex> lock(_mutex);
|
|
|
|
for (id<RCTUIManagerObserver> observer in _observers) {
|
|
if ([observer respondsToSelector:@selector(uiManagerDidPerformMounting:)]) {
|
|
[observer uiManagerDidPerformMounting:manager];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@end
|