From 0416fa6c6f3ff0e445dec32b8311eae55da0dfc8 Mon Sep 17 00:00:00 2001 From: Matej Bukovinski Date: Sun, 17 Jul 2016 07:29:40 +0200 Subject: [PATCH] Improve display link creation --- MBProgressHUD.m | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/MBProgressHUD.m b/MBProgressHUD.m index 121eb5c..aee2252 100644 --- a/MBProgressHUD.m +++ b/MBProgressHUD.m @@ -217,7 +217,7 @@ static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; self.alpha = 1.f; // Needed in case we hide and re-show with the same NSProgress object attached. - [self setUpProgressDidsplayLink]; + [self setNSProgressDisplayLinkEnabled:YES]; if (animated) { [self animateIn:YES withType:self.animationType completion:NULL]; @@ -290,7 +290,7 @@ static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; - (void)done { // Cancel any scheduled hideDelayed: calls [self.hideDelayTimer invalidate]; - [self invalidateProgressDisplayLink]; + [self setNSProgressDisplayLinkEnabled:NO]; if (self.hasFinished) { self.alpha = 0.0f; @@ -705,7 +705,7 @@ static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; - (void)setProgressObject:(NSProgress *)progressObject { if (progressObject != _progressObject) { _progressObject = progressObject; - [self setUpProgressDidsplayLink]; + [self setNSProgressDisplayLinkEnabled:YES]; } } @@ -735,18 +735,19 @@ static const CGFloat MBDefaultDetailsLabelFontSize = 12.f; #pragma mark - NSProgress -- (void)setUpProgressDidsplayLink { - if (self.progressObject) { - // We're using CADisplayLink, because NSProgress can change very quickly and observing it may starve the main thread, - // so we're refreshing the progress only every frame draw - self.progressObjectDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateProgressFromProgressObject)]; +- (void)setNSProgressDisplayLinkEnabled:(BOOL)enabled { + // We're using CADisplayLink, because NSProgress can change very quickly and observing it may starve the main thread, + // so we're refreshing the progress only every frame draw + if (enabled && self.progressObject) { + // Only create if not already active. + if (!self.progressObjectDisplayLink) { + self.progressObjectDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateProgressFromProgressObject)]; + } + } else { + self.progressObjectDisplayLink = nil; } } -- (void)invalidateProgressDisplayLink { - self.progressObjectDisplayLink = nil; -} - - (void)updateProgressFromProgressObject { self.progress = self.progressObject.fractionCompleted; }