Skip to content

Commit 6cba4d2

Browse files
p-sunfacebook-github-bot
authored andcommitted
iOS: Fix image instrumentation lifecycle on image cancel
Summary: Internal loggers were not deallocated when images were canceled on RCTImageView Reviewed By: fkgozali Differential Revision: D21380284 fbshipit-source-id: 00440cf49708ec03ecd7d9268001aa458ccbf923
1 parent 452cb9a commit 6cba4d2

4 files changed

+26
-5
lines changed

Libraries/Image/RCTImageLoader.mm

+14-2
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ - (RCTImageURLLoaderRequest *)_loadImageOrDataWithURLRequest:(NSURLRequest *)req
563563
}
564564
}
565565
});
566-
566+
567567
return [[RCTImageURLLoaderRequest alloc] initWithRequestId:requestId imageURL:request.URL cancellationBlock:^{
568568
BOOL alreadyCancelled = atomic_fetch_or(cancelled.get(), 1);
569569
if (alreadyCancelled) {
@@ -801,12 +801,24 @@ - (void)trackURLImageVisibilityForRequest:(RCTImageURLLoaderRequest *)loaderRequ
801801
}
802802
}
803803

804+
- (void)trackURLImageRequestDidCancel:(RCTImageURLLoaderRequest *)loaderRequest
805+
{
806+
if (!loaderRequest) {
807+
return;
808+
}
809+
810+
id<RCTImageURLLoader> loadHandler = [self imageURLLoaderForURL:loaderRequest.imageURL];
811+
if ([loadHandler respondsToSelector:@selector(trackURLImageRequestDidCancel:)]) {
812+
[(id<RCTImageURLLoaderWithAttribution>)loadHandler trackURLImageRequestDidCancel:loaderRequest];
813+
}
814+
}
815+
804816
- (void)trackURLImageDidDestroy:(RCTImageURLLoaderRequest *)loaderRequest
805817
{
806818
if (!loaderRequest) {
807819
return;
808820
}
809-
821+
810822
id<RCTImageURLLoader> loadHandler = [self imageURLLoaderForURL:loaderRequest.imageURL];
811823
if ([loadHandler respondsToSelector:@selector(trackURLImageDidDestroy:)]) {
812824
[(id<RCTImageURLLoaderWithAttribution>)loadHandler trackURLImageDidDestroy:loaderRequest];

Libraries/Image/RCTImageLoaderWithAttributionProtocol.h

+5
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ RCT_EXTERN void RCTEnableImageLoadingPerfInstrumentation(BOOL enabled);
4444
*/
4545
- (void)trackURLImageVisibilityForRequest:(RCTImageURLLoaderRequest *)loaderRequest imageView:(UIView *)imageView;
4646

47+
/**
48+
* Image instrumentation - notify that the request was cancelled.
49+
*/
50+
- (void)trackURLImageRequestDidCancel:(RCTImageURLLoaderRequest *)loaderRequest;
51+
4752
/**
4853
* Image instrumentation - notify that the native image view was destroyed.
4954
*/

Libraries/Image/RCTImageURLLoaderWithAttribution.h

+5
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ struct ImageURLLoaderAttribution {
6565
*/
6666
- (void)trackURLImageVisibilityForRequest:(RCTImageURLLoaderRequest *)loaderRequest imageView:(UIView *)imageView;
6767

68+
/**
69+
* Image instrumentation - notify that the request was cancelled.
70+
*/
71+
- (void)trackURLImageRequestDidCancel:(RCTImageURLLoaderRequest *)loaderRequest;
72+
6873
/**
6974
* Image instrumentation - notify that the native image view was destroyed.
7075
*/

Libraries/Image/RCTImageView.mm

+2-3
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,8 @@ - (void)setResizeMode:(RCTResizeMode)resizeMode
218218

219219
- (void)cancelImageLoad
220220
{
221-
if (_loaderRequest.cancellationBlock) {
222-
_loaderRequest.cancellationBlock();
223-
}
221+
[_loaderRequest cancel];
222+
[_imageLoader trackURLImageRequestDidCancel:_loaderRequest];
224223

225224
_loaderRequest = nil;
226225
_pendingImageSource = nil;

0 commit comments

Comments
 (0)