From 4b8d07ebf367445732960fe47be0c790df0f7e5a Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Mon, 24 Jun 2019 18:29:17 -0700 Subject: [PATCH] Fabric: Fixed another crash in RCTImageComponentView (nulled event emitter) Summary: This fixes a crash happened in Image component caused by a race between recycling a component and image loading event are being delivered asynchronously. Reviewed By: mdvacca Differential Revision: D15977418 fbshipit-source-id: ac6f4b3d2b995af2afd56e551380a32d0f14ab15 --- .../ComponentViews/Image/RCTImageComponentView.mm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm b/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm index 6d579e16452..3620291ade4 100644 --- a/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm @@ -125,6 +125,13 @@ - (void)didReceiveImage:(UIImage *)image fromObserver:(void *)observer { + if (!_eventEmitter) { + // Notifications are delivered asynchronously and might arrive after the view is already recycled. + // In the future, we should incorporate an `EventEmitter` into a separate object owned by `ImageRequest` or `State`. + // See for more info: T46311063. + return; + } + std::static_pointer_cast(_eventEmitter)->onLoad(); const auto &imageProps = *std::static_pointer_cast(_props); @@ -153,11 +160,19 @@ - (void)didReceiveProgress:(float)progress fromObserver:(void *)observer { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onProgress(progress); } - (void)didReceiveFailureFromObserver:(void *)observer { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onError(); }