From 108a3de4b7424c9cdb7820ffde6cace215e4d8ae Mon Sep 17 00:00:00 2001 From: georgewhliu Date: Tue, 21 Nov 2023 18:05:45 +0800 Subject: [PATCH] feat(ios): optimize method loadImage:completed: --- .../image/HippyImageViewCustomLoader.h | 9 ++++++- .../view/HippyBackgroundImageCacheManager.m | 6 ++--- .../image loader/HippyImageLoaderModule.m | 27 ++++++++++++++++--- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/ios/sdk/component/image/HippyImageViewCustomLoader.h b/ios/sdk/component/image/HippyImageViewCustomLoader.h index 7a6f2d8c3d0..1c7b0a37b7c 100644 --- a/ios/sdk/component/image/HippyImageViewCustomLoader.h +++ b/ios/sdk/component/image/HippyImageViewCustomLoader.h @@ -40,6 +40,11 @@ typedef void(^HippyImageLoaderCompletionBlock)(NSData *_Nullable data, UIImage *_Nullable image, HippyImageCustomLoaderControlOptions options); +typedef void(^HippyImageLoaderLoadURLCompletionBlock)(NSData *_Nullable data, + NSURL * _Nonnull url, + NSError *_Nullable error, + UIImage *_Nullable image, + BOOL cached); @protocol HippyImageViewCustomLoader @@ -47,6 +52,8 @@ typedef void(^HippyImageLoaderCompletionBlock)(NSData *_Nullable data, - (BOOL)canHandleImageURL:(NSURL *)url; ++ (NSData *)convertImageToData:(UIImage *)image; + @required - (void)imageView:(HippyImageView *)imageView @@ -57,7 +64,7 @@ typedef void(^HippyImageLoaderCompletionBlock)(NSData *_Nullable data, - (void)cancelImageDownload:(UIImageView *)imageView withUrl:(NSURL *)url; -- (void)loadImage:(NSURL *)url completed:(void (^)(NSData *, NSURL *, NSError *, BOOL cached))completedBlock; +- (void)loadImage:(NSURL *)url completed:(HippyImageLoaderLoadURLCompletionBlock)completedBlock; @end diff --git a/ios/sdk/component/view/HippyBackgroundImageCacheManager.m b/ios/sdk/component/view/HippyBackgroundImageCacheManager.m index caf748c7733..46021a1ba96 100644 --- a/ios/sdk/component/view/HippyBackgroundImageCacheManager.m +++ b/ios/sdk/component/view/HippyBackgroundImageCacheManager.m @@ -80,9 +80,9 @@ - (void)imageWithUrl:(NSString *)uri completionHandler:(HippyBackgroundImageComp } id imageLoader = self.bridge.imageLoader; if (imageLoader) { - [imageLoader loadImage:imageURL completed:^(NSData *imgData, NSURL *url, NSError *error, BOOL cached) { - UIImage *image = [UIImage imageWithData:imgData scale:[UIScreen mainScreen].scale]; - completionHandler(image, error); + [imageLoader loadImage:imageURL completed:^(NSData *imgData, NSURL *url, NSError *error, UIImage *image, BOOL cached) { + UIImage *img = image ?: [UIImage imageWithData:imgData scale:[UIScreen mainScreen].scale]; + completionHandler(img, error); }]; } else { if ([uri hasPrefix:@"http://"] || [uri hasPrefix:@"https://"]) { diff --git a/ios/sdk/module/image loader/HippyImageLoaderModule.m b/ios/sdk/module/image loader/HippyImageLoaderModule.m index 43294911bb5..eadfd47fb66 100644 --- a/ios/sdk/module/image loader/HippyImageLoaderModule.m +++ b/ios/sdk/module/image loader/HippyImageLoaderModule.m @@ -71,8 +71,17 @@ @implementation HippyImageLoaderModule }; if (_bridge.imageLoader && [_bridge.imageLoader respondsToSelector: @selector(loadImage:completed:)]) { - [_bridge.imageLoader loadImage: source_url completed:^(NSData *data, NSURL *url, NSError *error, BOOL cached) { - completedBlock(cached, data, url, error); + __weak typeof(self) weakSelf = self; + [_bridge.imageLoader loadImage: source_url completed:^(NSData *data, NSURL *url, NSError *error, UIImage *image, BOOL cached) { + __strong typeof(weakSelf) strongSelf = weakSelf; + if (data) { + completedBlock(cached, data, url, error); + return; + } + + if (image && [strongSelf.bridge.imageLoader respondsToSelector: @selector(convertImageToData:)]) { + completedBlock(cached, [strongSelf.bridge.imageLoader convertImageToData:image], url, error); + } }]; } else { [[[NSURLSession sharedSession] dataTaskWithURL:source_url completionHandler:^(NSData * _Nullable data, __unused NSURLResponse * _Nullable response, NSError * _Nullable error) { @@ -104,8 +113,18 @@ @implementation HippyImageLoaderModule }; if (_bridge.imageLoader && [_bridge.imageLoader respondsToSelector: @selector(loadImage:completed:)]) { - [_bridge.imageLoader loadImage: source_url completed:^(NSData *data, NSURL *url, NSError *error, BOOL cached) { - completedBlock(cached, data); + __weak typeof(self) weakSelf = self; + [_bridge.imageLoader loadImage: source_url completed:^(NSData *data, NSURL *url, NSError *error, UIImage *image, BOOL cached) { + __strong typeof(weakSelf) strongSelf = weakSelf; + if (data) { + completedBlock(cached, data); + return; + } + + if (image && [strongSelf.bridge.imageLoader respondsToSelector: @selector(convertImageToData:)]) { + completedBlock(cached, [strongSelf.bridge.imageLoader convertImageToData:image]); + } + }]; } else { [[[NSURLSession sharedSession] dataTaskWithURL:source_url completionHandler:^(NSData * _Nullable data, __unused NSURLResponse * _Nullable response, NSError * _Nullable error) {