diff --git a/React/Base/RCTUtils.h b/React/Base/RCTUtils.h index 5643035b55e..ecb79159413 100644 --- a/React/Base/RCTUtils.h +++ b/React/Base/RCTUtils.h @@ -40,6 +40,9 @@ RCT_EXTERN void RCTExecuteOnMainQueue(dispatch_block_t block); // Please do not use this unless you know what you're doing. RCT_EXTERN void RCTUnsafeExecuteOnMainQueueSync(dispatch_block_t block); +// Get screen scale, can be only used on main +RCT_EXTERN void RCTComputeScreenScale(void); + // Get screen metrics in a thread-safe way RCT_EXTERN CGFloat RCTScreenScale(void); RCT_EXTERN CGFloat RCTFontSizeMultiplier(void); diff --git a/React/Base/RCTUtils.m b/React/Base/RCTUtils.m index 6478f8292c2..d33c174e57c 100644 --- a/React/Base/RCTUtils.m +++ b/React/Base/RCTUtils.m @@ -296,16 +296,23 @@ static void RCTUnsafeExecuteOnMainQueueOnceSync(dispatch_once_t *onceToken, disp } } +static dispatch_once_t onceTokenScreenScale; +static CGFloat screenScale; + +void RCTComputeScreenScale() +{ + dispatch_once(&onceTokenScreenScale, ^{ + screenScale = [UIScreen mainScreen].scale; + }); +} + CGFloat RCTScreenScale() { - static dispatch_once_t onceToken; - static CGFloat scale; - - RCTUnsafeExecuteOnMainQueueOnceSync(&onceToken, ^{ - scale = [UIScreen mainScreen].scale; + RCTUnsafeExecuteOnMainQueueOnceSync(&onceTokenScreenScale, ^{ + screenScale = [UIScreen mainScreen].scale; }); - return scale; + return screenScale; } CGFloat RCTFontSizeMultiplier()