Pass mutation list to RCTMountingTransactionObserving callbacks
Summary: Re-land of previous reverted commit. Changelog: [Internal] Reviewed By: cortinico, cipolleschi Differential Revision: D35843710 fbshipit-source-id: 3adde4fba2f2702ad5b85b3b52b2f68843c6c9f2
This commit is contained in:
Родитель
a65ae8eff6
Коммит
3a721f48b1
|
@ -192,7 +192,8 @@ static ModalHostViewEventEmitter::OnOrientationChange onOrientationChangeStruct(
|
|||
|
||||
#pragma mark - RCTMountingTransactionObserving
|
||||
|
||||
- (void)mountingTransactionWillMountWithMetadata:(MountingTransactionMetadata const &)metadata
|
||||
- (void)mountingTransactionWillMount:(MountingTransaction const &)transaction
|
||||
withSurfaceTelemetry:(facebook::react::SurfaceTelemetry const &)surfaceTelemetry
|
||||
{
|
||||
_modalContentsSnapshot = [self.viewController.view snapshotViewAfterScreenUpdates:NO];
|
||||
}
|
||||
|
|
|
@ -147,7 +147,8 @@ static void RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrol
|
|||
|
||||
#pragma mark - RCTMountingTransactionObserving
|
||||
|
||||
- (void)mountingTransactionDidMountWithMetadata:(MountingTransactionMetadata const &)metadata
|
||||
- (void)mountingTransactionDidMount:(MountingTransaction const &)transaction
|
||||
withSurfaceTelemetry:(facebook::react::SurfaceTelemetry const &)surfaceTelemetry
|
||||
{
|
||||
[self _remountChildren];
|
||||
}
|
||||
|
|
|
@ -95,9 +95,9 @@ static Class<RCTComponentViewProtocol> RCTComponentViewClassWithName(const char
|
|||
{
|
||||
.viewClass = viewClass,
|
||||
.observesMountingTransactionWillMount =
|
||||
(bool)class_respondsToSelector(viewClass, @selector(mountingTransactionWillMountWithMetadata:)),
|
||||
(bool)class_respondsToSelector(viewClass, @selector(mountingTransactionWillMount:withSurfaceTelemetry:)),
|
||||
.observesMountingTransactionDidMount =
|
||||
(bool)class_respondsToSelector(viewClass, @selector(mountingTransactionDidMountWithMetadata:)),
|
||||
(bool)class_respondsToSelector(viewClass, @selector(mountingTransactionDidMount:withSurfaceTelemetry:)),
|
||||
};
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
|
|
|
@ -266,15 +266,16 @@ static void RCTPerformMountInstructions(
|
|||
auto surfaceId = mountingCoordinator->getSurfaceId();
|
||||
|
||||
mountingCoordinator->getTelemetryController().pullTransaction(
|
||||
[&](MountingTransactionMetadata metadata) {
|
||||
[&](MountingTransaction const &transaction, SurfaceTelemetry const &surfaceTelemetry) {
|
||||
[self.delegate mountingManager:self willMountComponentsWithRootTag:surfaceId];
|
||||
_observerCoordinator.notifyObserversMountingTransactionWillMount(metadata);
|
||||
_observerCoordinator.notifyObserversMountingTransactionWillMount(transaction, surfaceTelemetry);
|
||||
},
|
||||
[&](ShadowViewMutationList const &mutations) {
|
||||
RCTPerformMountInstructions(mutations, _componentViewRegistry, _observerCoordinator, surfaceId);
|
||||
[&](MountingTransaction const &transaction, SurfaceTelemetry const &surfaceTelemetry) {
|
||||
RCTPerformMountInstructions(
|
||||
transaction.getMutations(), _componentViewRegistry, _observerCoordinator, surfaceId);
|
||||
},
|
||||
[&](MountingTransactionMetadata metadata) {
|
||||
_observerCoordinator.notifyObserversMountingTransactionDidMount(metadata);
|
||||
[&](MountingTransaction const &transaction, SurfaceTelemetry const &surfaceTelemetry) {
|
||||
_observerCoordinator.notifyObserversMountingTransactionDidMount(transaction, surfaceTelemetry);
|
||||
[self.delegate mountingManager:self didMountComponentsWithRootTag:surfaceId];
|
||||
});
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#import <butter/map.h>
|
||||
#import <butter/set.h>
|
||||
|
||||
#import <react/renderer/mounting/MountingTransactionMetadata.h>
|
||||
#include <react/renderer/mounting/MountingTransaction.h>
|
||||
|
||||
class RCTMountingTransactionObserverCoordinator final {
|
||||
public:
|
||||
|
@ -31,9 +31,11 @@ class RCTMountingTransactionObserverCoordinator final {
|
|||
* To be called from `RCTMountingManager`.
|
||||
*/
|
||||
void notifyObserversMountingTransactionWillMount(
|
||||
facebook::react::MountingTransactionMetadata const &metadata) const;
|
||||
facebook::react::MountingTransaction const &transaction,
|
||||
facebook::react::SurfaceTelemetry const &surfaceTelemetry) const;
|
||||
void notifyObserversMountingTransactionDidMount(
|
||||
facebook::react::MountingTransactionMetadata const &metadata) const;
|
||||
facebook::react::MountingTransaction const &transaction,
|
||||
facebook::react::SurfaceTelemetry const &surfaceTelemetry) const;
|
||||
|
||||
private:
|
||||
facebook::butter::map<
|
||||
|
|
|
@ -40,9 +40,10 @@ void RCTMountingTransactionObserverCoordinator::unregisterViewComponentDescripto
|
|||
}
|
||||
|
||||
void RCTMountingTransactionObserverCoordinator::notifyObserversMountingTransactionWillMount(
|
||||
MountingTransactionMetadata const &metadata) const
|
||||
MountingTransaction const &transaction,
|
||||
SurfaceTelemetry const &surfaceTelemetry) const
|
||||
{
|
||||
auto surfaceId = metadata.surfaceId;
|
||||
auto surfaceId = transaction.getSurfaceId();
|
||||
auto surfaceRegistryIterator = registry_.find(surfaceId);
|
||||
if (surfaceRegistryIterator == registry_.end()) {
|
||||
return;
|
||||
|
@ -50,16 +51,17 @@ void RCTMountingTransactionObserverCoordinator::notifyObserversMountingTransacti
|
|||
auto &surfaceRegistry = surfaceRegistryIterator->second;
|
||||
for (auto const &componentViewDescriptor : surfaceRegistry) {
|
||||
if (componentViewDescriptor.observesMountingTransactionWillMount) {
|
||||
[(id<RCTMountingTransactionObserving>)componentViewDescriptor.view
|
||||
mountingTransactionWillMountWithMetadata:metadata];
|
||||
[(id<RCTMountingTransactionObserving>)componentViewDescriptor.view mountingTransactionWillMount:transaction
|
||||
withSurfaceTelemetry:surfaceTelemetry];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RCTMountingTransactionObserverCoordinator::notifyObserversMountingTransactionDidMount(
|
||||
MountingTransactionMetadata const &metadata) const
|
||||
MountingTransaction const &transaction,
|
||||
SurfaceTelemetry const &surfaceTelemetry) const
|
||||
{
|
||||
auto surfaceId = metadata.surfaceId;
|
||||
auto surfaceId = transaction.getSurfaceId();
|
||||
auto surfaceRegistryIterator = registry_.find(surfaceId);
|
||||
if (surfaceRegistryIterator == registry_.end()) {
|
||||
return;
|
||||
|
@ -67,8 +69,8 @@ void RCTMountingTransactionObserverCoordinator::notifyObserversMountingTransacti
|
|||
auto &surfaceRegistry = surfaceRegistryIterator->second;
|
||||
for (auto const &componentViewDescriptor : surfaceRegistry) {
|
||||
if (componentViewDescriptor.observesMountingTransactionDidMount) {
|
||||
[(id<RCTMountingTransactionObserving>)componentViewDescriptor.view
|
||||
mountingTransactionDidMountWithMetadata:metadata];
|
||||
[(id<RCTMountingTransactionObserving>)componentViewDescriptor.view mountingTransactionDidMount:transaction
|
||||
withSurfaceTelemetry:surfaceTelemetry];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import <react/renderer/mounting/MountingTransactionMetadata.h>
|
||||
#include <react/renderer/mounting/MountingTransaction.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
@ -50,14 +50,16 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
* Is not being called for a component view which is being mounted as part of the transaction (because the view is not
|
||||
* registered as an observer yet).
|
||||
*/
|
||||
- (void)mountingTransactionWillMountWithMetadata:(facebook::react::MountingTransactionMetadata const &)metadata;
|
||||
- (void)mountingTransactionWillMount:(facebook::react::MountingTransaction const &)transaction
|
||||
withSurfaceTelemetry:(facebook::react::SurfaceTelemetry const &)surfaceTelemetry;
|
||||
|
||||
/*
|
||||
* Called right after the last mutation instruction is executed.
|
||||
* Is not being called for a component view which was being unmounted as part of the transaction (because the view is
|
||||
* not registered as an observer already).
|
||||
*/
|
||||
- (void)mountingTransactionDidMountWithMetadata:(facebook::react::MountingTransactionMetadata const &)metadata;
|
||||
- (void)mountingTransactionDidMount:(facebook::react::MountingTransaction const &)transaction
|
||||
withSurfaceTelemetry:(facebook::react::SurfaceTelemetry const &)surfaceTelemetry;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
#include "MountingTransactionMetadata.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace react {} // namespace react
|
||||
} // namespace facebook
|
|
@ -1,32 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <react/renderer/mounting/MountingTransaction.h>
|
||||
#include <react/renderer/telemetry/TransactionTelemetry.h>
|
||||
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
/*
|
||||
* Contains all (meta)information related to a MountingTransaction except a list
|
||||
* of mutation instructions.
|
||||
* The class is meant to be used when a consumer should not have access to all
|
||||
* information about the transaction (incapsulation) but still needs to observe
|
||||
* it to produce some side-effects.
|
||||
*/
|
||||
class MountingTransactionMetadata final {
|
||||
public:
|
||||
SurfaceId surfaceId;
|
||||
MountingTransaction::Number number;
|
||||
TransactionTelemetry telemetry;
|
||||
SurfaceTelemetry surfaceTelemetry;
|
||||
};
|
||||
|
||||
} // namespace react
|
||||
} // namespace facebook
|
|
@ -17,10 +17,9 @@ TelemetryController::TelemetryController(
|
|||
: mountingCoordinator_(mountingCoordinator) {}
|
||||
|
||||
bool TelemetryController::pullTransaction(
|
||||
std::function<void(MountingTransactionMetadata metadata)> const &willMount,
|
||||
std::function<void(ShadowViewMutationList const &mutations)> const &doMount,
|
||||
std::function<void(MountingTransactionMetadata metadata)> const &didMount)
|
||||
const {
|
||||
MountingTransactionCallback const &willMount,
|
||||
MountingTransactionCallback const &doMount,
|
||||
MountingTransactionCallback const &didMount) const {
|
||||
auto optional = mountingCoordinator_.pullTransaction();
|
||||
if (!optional.has_value()) {
|
||||
return false;
|
||||
|
@ -28,8 +27,6 @@ bool TelemetryController::pullTransaction(
|
|||
|
||||
auto transaction = std::move(*optional);
|
||||
|
||||
auto surfaceId = transaction.getSurfaceId();
|
||||
auto number = transaction.getNumber();
|
||||
auto telemetry = transaction.getTelemetry();
|
||||
auto numberOfMutations = static_cast<int>(transaction.getMutations().size());
|
||||
|
||||
|
@ -37,15 +34,15 @@ bool TelemetryController::pullTransaction(
|
|||
auto compoundTelemetry = compoundTelemetry_;
|
||||
mutex_.unlock();
|
||||
|
||||
willMount({surfaceId, number, telemetry, compoundTelemetry});
|
||||
willMount(transaction, compoundTelemetry);
|
||||
|
||||
telemetry.willMount();
|
||||
doMount(transaction.getMutations());
|
||||
doMount(transaction, compoundTelemetry);
|
||||
telemetry.didMount();
|
||||
|
||||
compoundTelemetry.incorporate(telemetry, numberOfMutations);
|
||||
|
||||
didMount({surfaceId, number, telemetry, compoundTelemetry});
|
||||
didMount(transaction, compoundTelemetry);
|
||||
|
||||
mutex_.lock();
|
||||
compoundTelemetry_ = compoundTelemetry;
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
#include <mutex>
|
||||
|
||||
#include <react/renderer/mounting/MountingTransaction.h>
|
||||
#include <react/renderer/mounting/MountingTransactionMetadata.h>
|
||||
#include <react/renderer/telemetry/TransactionTelemetry.h>
|
||||
|
||||
namespace facebook {
|
||||
|
@ -19,6 +18,10 @@ namespace react {
|
|||
|
||||
class MountingCoordinator;
|
||||
|
||||
using MountingTransactionCallback = std::function<void(
|
||||
MountingTransaction const &transaction,
|
||||
SurfaceTelemetry const &surfaceTelemetry)>;
|
||||
|
||||
/*
|
||||
* Provides convenient tools for aggregating and accessing telemetry data
|
||||
* associated with running Surface.
|
||||
|
@ -43,12 +46,9 @@ class TelemetryController final {
|
|||
* Calls `MountingCoordinator::pullTransaction()` and aggregates telemetry.
|
||||
*/
|
||||
bool pullTransaction(
|
||||
std::function<void(MountingTransactionMetadata metadata)> const
|
||||
&willMount,
|
||||
std::function<void(ShadowViewMutationList const &mutations)> const
|
||||
&doMount,
|
||||
std::function<void(MountingTransactionMetadata metadata)> const &didMount)
|
||||
const;
|
||||
MountingTransactionCallback const &willMount,
|
||||
MountingTransactionCallback const &doMount,
|
||||
MountingTransactionCallback const &didMount) const;
|
||||
|
||||
private:
|
||||
MountingCoordinator const &mountingCoordinator_;
|
||||
|
|
Загрузка…
Ссылка в новой задаче