From c1dbf407be8ca0877c00a0ee95622605405dbfe9 Mon Sep 17 00:00:00 2001 From: Mattt Thompson Date: Thu, 6 Oct 2011 10:43:48 -0500 Subject: [PATCH] [Issue #65] Adding slight delay when hiding network activity indicator, to avoid flickering --- .../AFNetworkActivityIndicatorManager.h | 1 + .../AFNetworkActivityIndicatorManager.m | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/AFNetworking/AFNetworkActivityIndicatorManager.h b/AFNetworking/AFNetworkActivityIndicatorManager.h index 4cd8908..9df6098 100644 --- a/AFNetworking/AFNetworkActivityIndicatorManager.h +++ b/AFNetworking/AFNetworkActivityIndicatorManager.h @@ -29,6 +29,7 @@ @private NSInteger _activityCount; BOOL _enabled; + NSTimer *_activityIndicatorVisibilityTimer; } /** diff --git a/AFNetworking/AFNetworkActivityIndicatorManager.m b/AFNetworking/AFNetworkActivityIndicatorManager.m index 7094ea6..f24b7c0 100644 --- a/AFNetworking/AFNetworkActivityIndicatorManager.m +++ b/AFNetworking/AFNetworkActivityIndicatorManager.m @@ -24,13 +24,21 @@ #import "AFHTTPRequestOperation.h" +static NSTimeInterval const kAFNetworkActivityIndicatorInvisibilityDelay = 0.25; + @interface AFNetworkActivityIndicatorManager () @property (readwrite, nonatomic, assign) NSInteger activityCount; +@property (readwrite, nonatomic, retain) NSTimer *activityIndicatorVisibilityTimer; +@property (readonly, getter = isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; + +- (void)updateNetworkActivityIndicatorVisibility; @end @implementation AFNetworkActivityIndicatorManager @synthesize activityCount = _activityCount; +@synthesize activityIndicatorVisibilityTimer = _activityIndicatorVisibilityTimer; @synthesize enabled = _enabled; +@dynamic networkActivityIndicatorVisible; + (AFNetworkActivityIndicatorManager *)sharedManager { static AFNetworkActivityIndicatorManager *_sharedManager = nil; @@ -50,13 +58,16 @@ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incrementActivityCount) name:AFNetworkingOperationDidStartNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(decrementActivityCount) name:AFNetworkingOperationDidFinishNotification object:nil]; - + return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; + [_activityIndicatorVisibilityTimer invalidate]; + [_activityIndicatorVisibilityTimer release]; _activityIndicatorVisibilityTimer = nil; + [super dealloc]; } @@ -66,10 +77,25 @@ [self didChangeValueForKey:@"activityCount"]; if (self.enabled) { - [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:self.activityCount > 0]; + // Delay hiding of activity indicator for a short interval, to avoid flickering + if (![self isNetworkActivityIndicatorVisible]) { + [self.activityIndicatorVisibilityTimer invalidate]; + self.activityIndicatorVisibilityTimer = [NSTimer timerWithTimeInterval:kAFNetworkActivityIndicatorInvisibilityDelay target:self selector:@selector(updateNetworkActivityIndicatorVisibility) userInfo:nil repeats:NO]; + [[NSRunLoop currentRunLoop] addTimer:self.activityIndicatorVisibilityTimer forMode:NSRunLoopCommonModes]; + } else { + [self updateNetworkActivityIndicatorVisibility]; + } } } +- (BOOL)isNetworkActivityIndicatorVisible { + return self.activityCount > 0; +} + +- (void)updateNetworkActivityIndicatorVisibility { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:[self isNetworkActivityIndicatorVisible]]; +} + - (void)incrementActivityCount { @synchronized(self) { self.activityCount += 1;