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:
Michael Schneider 2016-06-16 18:18:43 -07:00 committed by appleguy
parent efab1a4855
commit aa5d730eab
5 changed files with 22 additions and 4 deletions

View File

@ -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;
});
}

View File

@ -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;
});
}

View File

@ -260,7 +260,7 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ];
// actually dealloc.
__block ASTextKitRenderer *renderer = _renderer;
ASPerformBlockOnBackgroundThread(^{
ASPerformBlockOnDeallocationQueue(^{
renderer = nil;
});
_renderer = nil;

View File

@ -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();

View File

@ -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;