mirror of
https://github.com/status-im/react-native.git
synced 2025-01-13 19:15:05 +00:00
Introducing smart RCTUnsafeExecuteOnMainQueueOnceSync()
and fixed RCTScreenScale()
Summary: (This diff was decoupled from D4983054 which landing was quite delayed.) `RCTUnsafeExecuteOnMainQueueOnceSync()` synchronously executes a block once, on main queue. I found that our old implementation of `RCTScreenScale()` causes deadlock when it is called from main and background thread simultaneously. After I implemented my own solution I googled this issue and found an article by Ben Alpert with this awesome helper: https://benalpert.com/2014/04/02/dispatch-once-initialization-on-the-main-thread.html So, I found it super useful and borrowed it. Hey spicyj! :) Reviewed By: fkgozali Differential Revision: D5632592 fbshipit-source-id: dff43a5780b7404a3cc109c66c131cef4f4df429
This commit is contained in:
parent
274f10feb4
commit
a7468a4acf
@ -264,14 +264,29 @@ void RCTUnsafeExecuteOnMainQueueSync(dispatch_block_t block)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void RCTUnsafeExecuteOnMainQueueOnceSync(dispatch_once_t *onceToken, dispatch_block_t block)
|
||||||
|
{
|
||||||
|
// The solution was borrowed from a post by Ben Alpert:
|
||||||
|
// https://benalpert.com/2014/04/02/dispatch-once-initialization-on-the-main-thread.html
|
||||||
|
// See also: https://www.mikeash.com/pyblog/friday-qa-2014-06-06-secrets-of-dispatch_once.html
|
||||||
|
if (RCTIsMainQueue()) {
|
||||||
|
dispatch_once(onceToken, block);
|
||||||
|
} else {
|
||||||
|
if (DISPATCH_EXPECT(*onceToken == 0L, NO)) {
|
||||||
|
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||||
|
dispatch_once(onceToken, block);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CGFloat RCTScreenScale()
|
CGFloat RCTScreenScale()
|
||||||
{
|
{
|
||||||
static CGFloat scale;
|
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
dispatch_once(&onceToken, ^{
|
static CGFloat scale;
|
||||||
RCTUnsafeExecuteOnMainQueueSync(^{
|
|
||||||
scale = [UIScreen mainScreen].scale;
|
RCTUnsafeExecuteOnMainQueueOnceSync(&onceToken, ^{
|
||||||
});
|
scale = [UIScreen mainScreen].scale;
|
||||||
});
|
});
|
||||||
|
|
||||||
return scale;
|
return scale;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user