mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Cancel image download when ImageRequest changes (#37223)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/37223 changelog: [internal] Cancel image download when image source changes or <ImageView /> is recycled. bypass-github-export-checks Reviewed By: javache Differential Revision: D45524686 fbshipit-source-id: 515a153ddb214fdce51ff29243b68c5fd5479c64
This commit is contained in:
committed by
Facebook GitHub Bot
parent
0688458813
commit
523c77da59
+12
-1
@@ -14,6 +14,7 @@
|
||||
#import <react/renderer/components/image/ImageComponentDescriptor.h>
|
||||
#import <react/renderer/components/image/ImageEventEmitter.h>
|
||||
#import <react/renderer/components/image/ImageProps.h>
|
||||
#import <react/renderer/core/CoreFeatures.h>
|
||||
#import <react/renderer/imagemanager/ImageRequest.h>
|
||||
#import <react/renderer/imagemanager/RCTImagePrimitivesConversions.h>
|
||||
|
||||
@@ -97,8 +98,18 @@ using namespace facebook::react;
|
||||
- (void)_setStateAndResubscribeImageResponseObserver:(ImageShadowNode::ConcreteState::Shared const &)state
|
||||
{
|
||||
if (_state) {
|
||||
auto &observerCoordinator = _state->getData().getImageRequest().getObserverCoordinator();
|
||||
auto const &imageRequest = _state->getData().getImageRequest();
|
||||
auto &observerCoordinator = imageRequest.getObserverCoordinator();
|
||||
observerCoordinator.removeObserver(_imageResponseObserverProxy);
|
||||
if (CoreFeatures::cancelImageDownloadsOnRecycle) {
|
||||
// Cancelling image request because we are no longer observing it.
|
||||
// This is not 100% correct place to do this because we may want to
|
||||
// re-create RCTImageComponentView with the same image and if it
|
||||
// was cancelled before downloaded, download is not resumed.
|
||||
// This will only become issue if we decouple life cycle of a
|
||||
// ShadowNode from ComponentView, which is not something we do now.
|
||||
imageRequest.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
_state = state;
|
||||
|
||||
@@ -285,6 +285,10 @@ static BackgroundExecutor RCTGetBackgroundExecutor()
|
||||
CoreFeatures::cacheNSTextStorage = true;
|
||||
}
|
||||
|
||||
if (reactNativeConfig && reactNativeConfig->getBool("react_fabric:cancel_image_downloads_on_recycle")) {
|
||||
CoreFeatures::cancelImageDownloadsOnRecycle = true;
|
||||
}
|
||||
|
||||
auto componentRegistryFactory =
|
||||
[factory = wrapManagedObject(_mountingManager.componentViewRegistry.componentViewFactory)](
|
||||
EventDispatcher::Weak const &eventDispatcher, ContextContainer::Shared const &contextContainer) {
|
||||
|
||||
@@ -15,5 +15,6 @@ bool CoreFeatures::blockPaintForUseLayoutEffect = false;
|
||||
bool CoreFeatures::useNativeState = false;
|
||||
bool CoreFeatures::cacheNSTextStorage = false;
|
||||
bool CoreFeatures::cacheLastTextMeasurement = false;
|
||||
bool CoreFeatures::cancelImageDownloadsOnRecycle = false;
|
||||
|
||||
} // namespace facebook::react
|
||||
|
||||
@@ -43,6 +43,10 @@ class CoreFeatures {
|
||||
// This flag enables a caching mechanism to avoid subsequents measurements
|
||||
// of the same Text with the same constrainst.
|
||||
static bool cacheLastTextMeasurement;
|
||||
|
||||
// Fabric was not cancelling image downloads when <ImageView /> was removed
|
||||
// from view hierarchy. This feature flag enables this feature.
|
||||
static bool cancelImageDownloadsOnRecycle;
|
||||
};
|
||||
|
||||
} // namespace facebook::react
|
||||
|
||||
@@ -46,6 +46,12 @@ class ImageRequest final {
|
||||
*/
|
||||
void setCancelationFunction(std::function<void(void)> cancelationFunction);
|
||||
|
||||
/*
|
||||
* Calls cancel function if one is defined. Should be when downloading
|
||||
* image isn't needed anymore. E.g. <ImageView /> was removed.
|
||||
*/
|
||||
void cancel() const;
|
||||
|
||||
/*
|
||||
* Returns the Image Source associated with the request.
|
||||
*/
|
||||
|
||||
+6
@@ -21,6 +21,12 @@ void ImageRequest::setCancelationFunction(
|
||||
cancelRequest_ = cancelationFunction;
|
||||
}
|
||||
|
||||
void ImageRequest::cancel() const {
|
||||
if (cancelRequest_) {
|
||||
cancelRequest_();
|
||||
}
|
||||
}
|
||||
|
||||
const ImageSource &ImageRequest::getImageSource() const {
|
||||
return imageSource_;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user