浏览代码

Fix `NetworkActivityIndicator` kvo call back will trigger twice bug. (#4406)

* remove manual KVO in `AFNetworkActivityIndicatorManager`

* unified code style

* add a test case for KVO
Kinarobin 5 年之前
父节点
当前提交
3f2e551810
共有 2 个文件被更改,包括 21 次插入27 次删除
  1. 14 0
      Tests/Tests/AFNetworkActivityManagerTests.m
  2. 7 27
      UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m

+ 14 - 0
Tests/Tests/AFNetworkActivityManagerTests.m

@@ -184,4 +184,18 @@
 
 
 }
 }
 
 
+- (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
 @end

+ 7 - 27
UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m

@@ -109,11 +109,9 @@ typedef void (^AFNetworkActivityActionBlock)(BOOL networkActivityIndicatorVisibl
 
 
 - (void)setNetworkActivityIndicatorVisible:(BOOL)networkActivityIndicatorVisible {
 - (void)setNetworkActivityIndicatorVisible:(BOOL)networkActivityIndicatorVisible {
     if (_networkActivityIndicatorVisible != networkActivityIndicatorVisible) {
     if (_networkActivityIndicatorVisible != networkActivityIndicatorVisible) {
-        [self willChangeValueForKey:@"networkActivityIndicatorVisible"];
         @synchronized(self) {
         @synchronized(self) {
-             _networkActivityIndicatorVisible = networkActivityIndicatorVisible;
+            _networkActivityIndicatorVisible = networkActivityIndicatorVisible;
         }
         }
-        [self didChangeValueForKey:@"networkActivityIndicatorVisible"];
         if (self.networkActivityActionBlock) {
         if (self.networkActivityActionBlock) {
             self.networkActivityActionBlock(networkActivityIndicatorVisible);
             self.networkActivityActionBlock(networkActivityIndicatorVisible);
         } else {
         } else {
@@ -122,35 +120,20 @@ typedef void (^AFNetworkActivityActionBlock)(BOOL networkActivityIndicatorVisibl
     }
     }
 }
 }
 
 
-- (void)setActivityCount:(NSInteger)activityCount {
-	@synchronized(self) {
-		_activityCount = activityCount;
-	}
-
-    dispatch_async(dispatch_get_main_queue(), ^{
-        [self updateCurrentStateForNetworkActivityChange];
-    });
-}
 
 
 - (void)incrementActivityCount {
 - (void)incrementActivityCount {
-    [self willChangeValueForKey:@"activityCount"];
-	@synchronized(self) {
-		_activityCount++;
-	}
-    [self didChangeValueForKey:@"activityCount"];
-
+    @synchronized(self) {
+        self.activityCount++;
+    }
     dispatch_async(dispatch_get_main_queue(), ^{
     dispatch_async(dispatch_get_main_queue(), ^{
         [self updateCurrentStateForNetworkActivityChange];
         [self updateCurrentStateForNetworkActivityChange];
     });
     });
 }
 }
 
 
 - (void)decrementActivityCount {
 - (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(), ^{
     dispatch_async(dispatch_get_main_queue(), ^{
         [self updateCurrentStateForNetworkActivityChange];
         [self updateCurrentStateForNetworkActivityChange];
     });
     });
@@ -172,7 +155,6 @@ typedef void (^AFNetworkActivityActionBlock)(BOOL networkActivityIndicatorVisibl
 - (void)setCurrentState:(AFNetworkActivityManagerState)currentState {
 - (void)setCurrentState:(AFNetworkActivityManagerState)currentState {
     @synchronized(self) {
     @synchronized(self) {
         if (_currentState != currentState) {
         if (_currentState != currentState) {
-            [self willChangeValueForKey:@"currentState"];
             _currentState = currentState;
             _currentState = currentState;
             switch (currentState) {
             switch (currentState) {
                 case AFNetworkActivityManagerStateNotActive:
                 case AFNetworkActivityManagerStateNotActive:
@@ -191,9 +173,7 @@ typedef void (^AFNetworkActivityActionBlock)(BOOL networkActivityIndicatorVisibl
                     [self startCompletionDelayTimer];
                     [self startCompletionDelayTimer];
                     break;
                     break;
             }
             }
-            [self didChangeValueForKey:@"currentState"];
         }
         }
-        
     }
     }
 }
 }