mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-11 08:50:24 +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 ||
|
||||
imageSize.height > kMinReleaseImageOnBackgroundSize.height;
|
||||
if (shouldReleaseImageOnBackgroundThread) {
|
||||
ASPerformBlockOnBackgroundThread(^{
|
||||
ASPerformBlockOnDeallocationQueue(^{
|
||||
image = nil;
|
||||
});
|
||||
}
|
||||
|
||||
@ -378,7 +378,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0};
|
||||
BOOL shouldReleaseImageOnBackgroundThread = imageSize.width > kMinReleaseImageOnBackgroundSize.width ||
|
||||
imageSize.height > kMinReleaseImageOnBackgroundSize.height;
|
||||
if (shouldReleaseImageOnBackgroundThread) {
|
||||
ASPerformBlockOnBackgroundThread(^{
|
||||
ASPerformBlockOnDeallocationQueue(^{
|
||||
image = nil;
|
||||
});
|
||||
}
|
||||
|
||||
@ -260,7 +260,7 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ];
|
||||
// actually dealloc.
|
||||
__block ASTextKitRenderer *renderer = _renderer;
|
||||
|
||||
ASPerformBlockOnBackgroundThread(^{
|
||||
ASPerformBlockOnDeallocationQueue(^{
|
||||
renderer = nil;
|
||||
});
|
||||
_renderer = nil;
|
||||
|
||||
@ -17,8 +17,15 @@ ASDISPLAYNODE_EXTERN_C_BEGIN
|
||||
|
||||
BOOL ASSubclassOverridesSelector(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 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();
|
||||
|
||||
|
||||
@ -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()
|
||||
{
|
||||
static CGFloat __scale = 0.0;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user