mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-13 01:40:12 +00:00
Deallocate objects on a serial queue specific for deallocation (#1737)
[Performance] Prevent GCD thread explosion due to object deallocation workloads (serial deallocation queue).
This commit is contained in:
parent
efab1a4855
commit
aa5d730eab
@ -531,7 +531,7 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent
|
|||||||
BOOL shouldReleaseImageOnBackgroundThread = imageSize.width > kMinReleaseImageOnBackgroundSize.width ||
|
BOOL shouldReleaseImageOnBackgroundThread = imageSize.width > kMinReleaseImageOnBackgroundSize.width ||
|
||||||
imageSize.height > kMinReleaseImageOnBackgroundSize.height;
|
imageSize.height > kMinReleaseImageOnBackgroundSize.height;
|
||||||
if (shouldReleaseImageOnBackgroundThread) {
|
if (shouldReleaseImageOnBackgroundThread) {
|
||||||
ASPerformBlockOnBackgroundThread(^{
|
ASPerformBlockOnDeallocationQueue(^{
|
||||||
image = nil;
|
image = nil;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -378,7 +378,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0};
|
|||||||
BOOL shouldReleaseImageOnBackgroundThread = imageSize.width > kMinReleaseImageOnBackgroundSize.width ||
|
BOOL shouldReleaseImageOnBackgroundThread = imageSize.width > kMinReleaseImageOnBackgroundSize.width ||
|
||||||
imageSize.height > kMinReleaseImageOnBackgroundSize.height;
|
imageSize.height > kMinReleaseImageOnBackgroundSize.height;
|
||||||
if (shouldReleaseImageOnBackgroundThread) {
|
if (shouldReleaseImageOnBackgroundThread) {
|
||||||
ASPerformBlockOnBackgroundThread(^{
|
ASPerformBlockOnDeallocationQueue(^{
|
||||||
image = nil;
|
image = nil;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -260,7 +260,7 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ];
|
|||||||
// actually dealloc.
|
// actually dealloc.
|
||||||
__block ASTextKitRenderer *renderer = _renderer;
|
__block ASTextKitRenderer *renderer = _renderer;
|
||||||
|
|
||||||
ASPerformBlockOnBackgroundThread(^{
|
ASPerformBlockOnDeallocationQueue(^{
|
||||||
renderer = nil;
|
renderer = nil;
|
||||||
});
|
});
|
||||||
_renderer = nil;
|
_renderer = nil;
|
||||||
|
|||||||
@ -17,8 +17,15 @@ ASDISPLAYNODE_EXTERN_C_BEGIN
|
|||||||
|
|
||||||
BOOL ASSubclassOverridesSelector(Class superclass, Class subclass, SEL selector);
|
BOOL ASSubclassOverridesSelector(Class superclass, Class subclass, SEL selector);
|
||||||
BOOL ASSubclassOverridesClassSelector(Class superclass, Class subclass, SEL selector);
|
BOOL ASSubclassOverridesClassSelector(Class superclass, Class subclass, SEL selector);
|
||||||
|
|
||||||
|
/// Dispatches the given block to the main queue if not already running on the main thread
|
||||||
void ASPerformBlockOnMainThread(void (^block)());
|
void ASPerformBlockOnMainThread(void (^block)());
|
||||||
void ASPerformBlockOnBackgroundThread(void (^block)()); // DISPATCH_QUEUE_PRIORITY_DEFAULT
|
|
||||||
|
/// Dispatches the given block to a background queue with priority of DISPATCH_QUEUE_PRIORITY_DEFAULT if not already run on a background queue
|
||||||
|
void ASPerformBlockOnBackgroundThread(void (^block)()); // DISPATCH_QUEUE_PRIORITY_DEFAULT
|
||||||
|
|
||||||
|
/// Dispatches a block on to a serial queue that's main purpose is for deallocation of objects on a background thread
|
||||||
|
void ASPerformBlockOnDeallocationQueue(void (^block)());
|
||||||
|
|
||||||
CGFloat ASScreenScale();
|
CGFloat ASScreenScale();
|
||||||
|
|
||||||
|
|||||||
@ -52,6 +52,17 @@ void ASPerformBlockOnBackgroundThread(void (^block)())
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASPerformBlockOnDeallocationQueue(void (^block)())
|
||||||
|
{
|
||||||
|
static dispatch_queue_t queue;
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
queue = dispatch_queue_create("org.AsyncDisplayKit.deallocationQueue", DISPATCH_QUEUE_SERIAL);
|
||||||
|
});
|
||||||
|
|
||||||
|
dispatch_async(queue, block);
|
||||||
|
}
|
||||||
|
|
||||||
CGFloat ASScreenScale()
|
CGFloat ASScreenScale()
|
||||||
{
|
{
|
||||||
static CGFloat __scale = 0.0;
|
static CGFloat __scale = 0.0;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user