From 3f2e55181061d878470dd2895311bb0914aa4bfd Mon Sep 17 00:00:00 2001 From: Kinarobin Date: Fri, 27 Mar 2020 09:20:47 +0800 Subject: [PATCH] Fix `NetworkActivityIndicator` kvo call back will trigger twice bug. (#4406) * remove manual KVO in `AFNetworkActivityIndicatorManager` * unified code style * add a test case for KVO --- Tests/Tests/AFNetworkActivityManagerTests.m | 14 ++++++++ .../AFNetworkActivityIndicatorManager.m | 34 ++++--------------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/Tests/Tests/AFNetworkActivityManagerTests.m b/Tests/Tests/AFNetworkActivityManagerTests.m index 764195ad7d..152eae6509 100644 --- a/Tests/Tests/AFNetworkActivityManagerTests.m +++ b/Tests/Tests/AFNetworkActivityManagerTests.m @@ -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 diff --git a/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m b/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m index e6f9b65ea1..8cb5677eff 100644 --- a/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m +++ b/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m @@ -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 { @@ -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]; }); @@ -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: @@ -191,9 +173,7 @@ - (void)setCurrentState:(AFNetworkActivityManagerState)currentState { [self startCompletionDelayTimer]; break; } - [self didChangeValueForKey:@"currentState"]; } - } }