Skip to content

Commit

Permalink
Fix NetworkActivityIndicator kvo call back will trigger twice bug. (A…
Browse files Browse the repository at this point in the history
…FNetworking#4406)

* remove manual KVO in `AFNetworkActivityIndicatorManager`

* unified code style

* add a test case for KVO
  • Loading branch information
kinarobin committed Mar 27, 2020
1 parent f484fdc commit 3f2e551
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 27 deletions.
14 changes: 14 additions & 0 deletions Tests/Tests/AFNetworkActivityManagerTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -184,4 +184,18 @@ - (void)testThatIndicatorBlockIsOnlyCalledOnceEachForStartAndEndForMultipleReque

}

- (void)testThatIndicatorKVOOnlyTriggerOnce {
// create new one indicator manager
AFNetworkActivityIndicatorManager *manager = [AFNetworkActivityIndicatorManager new];
__block NSInteger kvoTriggerCount = 0;

XCTKVOExpectation *activityCountExpectation = [[XCTKVOExpectation alloc] initWithKeyPath:@"activityCount" object:manager];
activityCountExpectation.handler = ^BOOL(id _Nonnull observedObject, NSDictionary * _Nonnull change) {
kvoTriggerCount += 1;
return [change[NSKeyValueChangeNewKey] isEqualToNumber:@(1)];
};
[manager incrementActivityCount];
XCTAssertTrue(kvoTriggerCount == 1);
}

@end
34 changes: 7 additions & 27 deletions UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,9 @@ - (BOOL)isNetworkActivityOccurring {

- (void)setNetworkActivityIndicatorVisible:(BOOL)networkActivityIndicatorVisible {
if (_networkActivityIndicatorVisible != networkActivityIndicatorVisible) {
[self willChangeValueForKey:@"networkActivityIndicatorVisible"];
@synchronized(self) {
_networkActivityIndicatorVisible = networkActivityIndicatorVisible;
_networkActivityIndicatorVisible = networkActivityIndicatorVisible;
}
[self didChangeValueForKey:@"networkActivityIndicatorVisible"];
if (self.networkActivityActionBlock) {
self.networkActivityActionBlock(networkActivityIndicatorVisible);
} else {
Expand All @@ -122,35 +120,20 @@ - (void)setNetworkActivityIndicatorVisible:(BOOL)networkActivityIndicatorVisible
}
}

- (void)setActivityCount:(NSInteger)activityCount {
@synchronized(self) {
_activityCount = activityCount;
}

dispatch_async(dispatch_get_main_queue(), ^{
[self updateCurrentStateForNetworkActivityChange];
});
}

- (void)incrementActivityCount {
[self willChangeValueForKey:@"activityCount"];
@synchronized(self) {
_activityCount++;
}
[self didChangeValueForKey:@"activityCount"];

@synchronized(self) {
self.activityCount++;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self updateCurrentStateForNetworkActivityChange];
});
}

- (void)decrementActivityCount {
[self willChangeValueForKey:@"activityCount"];
@synchronized(self) {
_activityCount = MAX(_activityCount - 1, 0);
}
[self didChangeValueForKey:@"activityCount"];

@synchronized(self) {
self.activityCount = MAX(_activityCount - 1, 0);
}
dispatch_async(dispatch_get_main_queue(), ^{
[self updateCurrentStateForNetworkActivityChange];
});
Expand All @@ -172,7 +155,6 @@ - (void)networkRequestDidFinish:(NSNotification *)notification {
- (void)setCurrentState:(AFNetworkActivityManagerState)currentState {
@synchronized(self) {
if (_currentState != currentState) {
[self willChangeValueForKey:@"currentState"];
_currentState = currentState;
switch (currentState) {
case AFNetworkActivityManagerStateNotActive:
Expand All @@ -191,9 +173,7 @@ - (void)setCurrentState:(AFNetworkActivityManagerState)currentState {
[self startCompletionDelayTimer];
break;
}
[self didChangeValueForKey:@"currentState"];
}

}
}

Expand Down

0 comments on commit 3f2e551

Please sign in to comment.