[Issue #375] Restore support for non-GCC compilers in AFNetworkActivityIndicatorManager

This commit is contained in:
Mattt Thompson 2012-06-14 08:50:49 -07:00
parent 286b8100c5
commit a0f592c23a

View file

@ -23,13 +23,12 @@
#import "AFNetworkActivityIndicatorManager.h" #import "AFNetworkActivityIndicatorManager.h"
#import "AFHTTPRequestOperation.h" #import "AFHTTPRequestOperation.h"
#import <libkern/OSAtomic.h>
#if __IPHONE_OS_VERSION_MIN_REQUIRED #if __IPHONE_OS_VERSION_MIN_REQUIRED
static NSTimeInterval const kAFNetworkActivityIndicatorInvisibilityDelay = 0.25; static NSTimeInterval const kAFNetworkActivityIndicatorInvisibilityDelay = 0.25;
@interface AFNetworkActivityIndicatorManager () @interface AFNetworkActivityIndicatorManager ()
@property (readwrite, nonatomic, assign) NSInteger activityCount; @property (readwrite, atomic, assign) NSInteger activityCount;
@property (readwrite, nonatomic, retain) NSTimer *activityIndicatorVisibilityTimer; @property (readwrite, nonatomic, retain) NSTimer *activityIndicatorVisibilityTimer;
@property (readonly, getter = isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; @property (readonly, getter = isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
@ -97,25 +96,31 @@ static NSTimeInterval const kAFNetworkActivityIndicatorInvisibilityDelay = 0.25;
} }
// Not exposed, but used if activityCount is set via KVC. // Not exposed, but used if activityCount is set via KVC.
- (NSInteger)activityCount {
return _activityCount;
}
- (void)setActivityCount:(NSInteger)activityCount { - (void)setActivityCount:(NSInteger)activityCount {
__sync_swap(&_activityCount, activityCount); @synchronized(self) {
_activityCount = activityCount;
}
[self updateNetworkActivityIndicatorVisibilityDelayed]; [self updateNetworkActivityIndicatorVisibilityDelayed];
} }
- (void)incrementActivityCount { - (void)incrementActivityCount {
[self willChangeValueForKey:@"activityCount"]; [self willChangeValueForKey:@"activityCount"];
OSAtomicIncrement32((int32_t*)&_activityCount); @synchronized(self) {
_activityCount++;
}
[self didChangeValueForKey:@"activityCount"]; [self didChangeValueForKey:@"activityCount"];
[self updateNetworkActivityIndicatorVisibilityDelayed]; [self updateNetworkActivityIndicatorVisibilityDelayed];
} }
- (void)decrementActivityCount { - (void)decrementActivityCount {
[self willChangeValueForKey:@"activityCount"]; [self willChangeValueForKey:@"activityCount"];
bool success; @synchronized(self) {
do { _activityCount--;
int32_t currentCount = _activityCount; }
success = OSAtomicCompareAndSwap32(currentCount, MIN(currentCount - 1, currentCount), &_activityCount);
} while(!success);
[self didChangeValueForKey:@"activityCount"]; [self didChangeValueForKey:@"activityCount"];
[self updateNetworkActivityIndicatorVisibilityDelayed]; [self updateNetworkActivityIndicatorVisibilityDelayed];
} }