From cc9e51ad17806f3c49e5ea1e4a5c836181fc0896 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Mon, 27 May 2024 22:02:23 +0800 Subject: [PATCH] fix(ios): potential deadlock in layout & unify all ScreenScale calls --- ios/sdk/base/HippyDeviceBaseInfo.m | 6 +--- .../image/HippyDefaultImageProvider.m | 3 +- .../view/HippyBackgroundImageCacheManager.m | 8 +++--- ios/sdk/component/view/HippyShadowView.mm | 2 +- ios/sdk/component/view/HippyViewManager.mm | 2 +- .../HippyCollectionViewWaterfallLayout.m | 3 +- ios/sdk/layout/x5LayoutUtil.m | 28 ++----------------- 7 files changed, 14 insertions(+), 38 deletions(-) diff --git a/ios/sdk/base/HippyDeviceBaseInfo.m b/ios/sdk/base/HippyDeviceBaseInfo.m index 36fe75eec0c..d56e247c744 100644 --- a/ios/sdk/base/HippyDeviceBaseInfo.m +++ b/ios/sdk/base/HippyDeviceBaseInfo.m @@ -49,11 +49,7 @@ BOOL isHippyScreenInOSDarkMode(void) { statusBarHeight = bridge.delegate.defaultStatusBarHeightNoMatterHiddenOrNot ?: 0.0; } } - static NSNumber *screenScale = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - screenScale = @([UIScreen mainScreen].scale); - }); + NSNumber *screenScale = @(HippyScreenScale()); NSDictionary *dimensions = @{ @"window" : @{ @"width": @(windowSize.width), diff --git a/ios/sdk/component/image/HippyDefaultImageProvider.m b/ios/sdk/component/image/HippyDefaultImageProvider.m index 0232032f2e3..6284c0ea4bb 100644 --- a/ios/sdk/component/image/HippyDefaultImageProvider.m +++ b/ios/sdk/component/image/HippyDefaultImageProvider.m @@ -24,6 +24,7 @@ #import "HippyDefaultImageProvider.h" #import "NSData+DataType.h" #import +#import "HippyUtils.h" @interface HippyDefaultImageProvider () { NSData *_data; @@ -72,7 +73,7 @@ - (UIImage *)image { CGFloat view_width = _imageViewSize.width; CGFloat view_height = _imageViewSize.height; if (_downSample && view_width > 0 && view_height > 0) { - CGFloat scale = [UIScreen mainScreen].scale; + CGFloat scale = HippyScreenScale(); NSDictionary *options = @{ (NSString *)kCGImageSourceShouldCache: @(NO) }; CGImageSourceRef ref = CGImageSourceCreateWithData((__bridge CFDataRef)_data, (__bridge CFDictionaryRef)options); if (ref) { diff --git a/ios/sdk/component/view/HippyBackgroundImageCacheManager.m b/ios/sdk/component/view/HippyBackgroundImageCacheManager.m index caf748c7733..851caaf4116 100644 --- a/ios/sdk/component/view/HippyBackgroundImageCacheManager.m +++ b/ios/sdk/component/view/HippyBackgroundImageCacheManager.m @@ -69,7 +69,7 @@ - (void)imageWithUrl:(NSString *)uri completionHandler:(HippyBackgroundImageComp BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:localPath isDirectory:&isDirectory]; if (fileExist && !isDirectory) { NSData *imageData = [NSData dataWithContentsOfFile:localPath]; - UIImage *image = [UIImage imageWithData:imageData scale:[UIScreen mainScreen].scale]; + UIImage *image = [UIImage imageWithData:imageData scale:HippyScreenScale()]; completionHandler(image, nil); } else { @@ -81,7 +81,7 @@ - (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]; + UIImage *image = [UIImage imageWithData:imgData scale:HippyScreenScale()]; completionHandler(image, error); }]; } else { @@ -103,7 +103,7 @@ - (void)loadHTTPURL:(NSURL *)URL completionHandler:(HippyBackgroundImageCompleti [session dataTaskWithRequest:request completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) { if (data) { - CGFloat scale = [UIScreen mainScreen].scale; + CGFloat scale = HippyScreenScale(); UIImage *originImage = [UIImage imageWithData:data scale:scale]; if (originImage) { completionHandler(originImage, nil); @@ -122,7 +122,7 @@ - (void)loadHTTPURL:(NSURL *)URL completionHandler:(HippyBackgroundImageCompleti - (void)loadBase64URL:(NSURL *)base64URL completionHandler:(HippyBackgroundImageCompletionHandler)completionHandler { NSData *imgData = [NSData dataWithContentsOfURL:base64URL]; if (imgData) { - UIImage *image = [UIImage imageWithData:imgData scale:[UIScreen mainScreen].scale]; + UIImage *image = [UIImage imageWithData:imgData scale:HippyScreenScale()]; if (image) { completionHandler(image, nil); } else { diff --git a/ios/sdk/component/view/HippyShadowView.mm b/ios/sdk/component/view/HippyShadowView.mm index 28e2e39ab1b..ff846d29ed6 100644 --- a/ios/sdk/component/view/HippyShadowView.mm +++ b/ios/sdk/component/view/HippyShadowView.mm @@ -368,7 +368,7 @@ - (instancetype)init { _hippySubviews = [NSMutableArray array]; - _nodeRef = MTTNodeNewWithScaleFactor([UIScreen mainScreen].scale); + _nodeRef = MTTNodeNewWithScaleFactor(HippyScreenScale()); } return self; } diff --git a/ios/sdk/component/view/HippyViewManager.mm b/ios/sdk/component/view/HippyViewManager.mm index 9f2c0aed3ef..1bc0685397d 100644 --- a/ios/sdk/component/view/HippyViewManager.mm +++ b/ios/sdk/component/view/HippyViewManager.mm @@ -189,7 +189,7 @@ - (HippyViewManagerUIBlock)uiBlockToAmendWithShadowViewRegistry:(__unused NSDict } HIPPY_CUSTOM_VIEW_PROPERTY(shouldRasterizeIOS, BOOL, HippyView) { view.layer.shouldRasterize = json ? [HippyConvert BOOL:json] : defaultView.layer.shouldRasterize; - view.layer.rasterizationScale = view.layer.shouldRasterize ? [UIScreen mainScreen].scale : defaultView.layer.rasterizationScale; + view.layer.rasterizationScale = view.layer.shouldRasterize ? HippyScreenScale() : defaultView.layer.rasterizationScale; } HIPPY_CUSTOM_VIEW_PROPERTY(transform, CATransform3D, HippyView) { diff --git a/ios/sdk/component/waterfalllist/HippyCollectionViewWaterfallLayout.m b/ios/sdk/component/waterfalllist/HippyCollectionViewWaterfallLayout.m index ccda6ad053d..bdbc8ba1b62 100644 --- a/ios/sdk/component/waterfalllist/HippyCollectionViewWaterfallLayout.m +++ b/ios/sdk/component/waterfalllist/HippyCollectionViewWaterfallLayout.m @@ -22,6 +22,7 @@ #import "HippyCollectionViewWaterfallLayout.h" #import "tgmath.h" +#import "HippyUtils.h" NSString *const HippyCollectionElementKindSectionHeader = @"HippyCollectionElementKindSectionHeader"; NSString *const HippyCollectionElementKindSectionFooter = @"HippyCollectionElementKindSectionFooter"; @@ -49,7 +50,7 @@ @implementation HippyCollectionViewWaterfallLayout static const NSInteger unionSize = 20; static CGFloat HippyFloorCGFloat(CGFloat value) { - CGFloat scale = [UIScreen mainScreen].scale; + CGFloat scale = HippyScreenScale(); return floor(value * scale) / scale; } diff --git a/ios/sdk/layout/x5LayoutUtil.m b/ios/sdk/layout/x5LayoutUtil.m index 58d70e215df..2cd809d369b 100644 --- a/ios/sdk/layout/x5LayoutUtil.m +++ b/ios/sdk/layout/x5LayoutUtil.m @@ -21,36 +21,14 @@ */ #import "x5LayoutUtil.h" - -static void x5ExecuteOnMainThread(dispatch_block_t block, BOOL sync) { - if (0 == strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue()))) { - block(); - } else if (sync) { - dispatch_sync(dispatch_get_main_queue(), block); - } else { - dispatch_async(dispatch_get_main_queue(), block); - } -} - -static CGFloat x5ScreenScale(void) { - static CGFloat scale; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - x5ExecuteOnMainThread( - ^{ - scale = [UIScreen mainScreen].scale; - }, YES); - }); - - return scale; -} +#import "HippyUtils.h" CGFloat x5CeilPixelValue(CGFloat value) { - CGFloat scale = x5ScreenScale(); + CGFloat scale = HippyScreenScale(); return ceil(value * scale) / scale; } CGFloat x5RoundPixelValue(CGFloat value) { - CGFloat scale = x5ScreenScale(); + CGFloat scale = HippyScreenScale(); return round(value * scale) / scale; }