فهرست منبع

Fix Retrier Leaks (#2491)

* Removes the old request to avoid endless growth.

* Add tests, update Travis.
Jon Shier 7 سال پیش
والد
کامیت
7bef9405f1
4فایلهای تغییر یافته به همراه13 افزوده شده و 3 حذف شده
  1. 2 2
      .travis.yml
  2. 1 1
      Source/SessionDelegate.swift
  3. 4 0
      Source/SessionManager.swift
  4. 6 0
      Tests/SessionManagerTests.swift

+ 2 - 2
.travis.yml

@@ -1,5 +1,5 @@
 language: objective-c
-osx_image: xcode9.3beta
+osx_image: xcode9.3
 branches:
   only:
     - master
@@ -21,7 +21,7 @@ env:
     - DESTINATION="OS=11.3,name=iPhone X"          SCHEME="$IOS_FRAMEWORK_SCHEME"      RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="YES"
     - DESTINATION="OS=10.3.1,name=iPhone 7 Plus"   SCHEME="$IOS_FRAMEWORK_SCHEME"      RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO"
     - DESTINATION="OS=9.3,name=iPhone 6"           SCHEME="$IOS_FRAMEWORK_SCHEME"      RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO"
-    - DESTINATION="OS=8.4,name=iPhone 4S"          SCHEME="$IOS_FRAMEWORK_SCHEME"      RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO"
+    # - DESTINATION="OS=8.4,name=iPhone 4S"          SCHEME="$IOS_FRAMEWORK_SCHEME"      RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO"
 
     - DESTINATION="OS=11.3,name=Apple TV 4K"       SCHEME="$TVOS_FRAMEWORK_SCHEME"     RUN_TESTS="YES" BUILD_EXAMPLE="NO"  POD_LINT="NO"
     - DESTINATION="OS=10.2,name=Apple TV 1080p"    SCHEME="$TVOS_FRAMEWORK_SCHEME"     RUN_TESTS="YES" BUILD_EXAMPLE="NO"  POD_LINT="NO"

+ 1 - 1
Source/SessionDelegate.swift

@@ -163,7 +163,7 @@ open class SessionDelegate: NSObject {
     var retrier: RequestRetrier?
     weak var sessionManager: SessionManager?
 
-    private var requests: [Int: Request] = [:]
+    var requests: [Int: Request] = [:]
     private let lock = NSLock()
 
     /// Access the task delegate for the specified task in a thread-safe manner.

+ 4 - 0
Source/SessionManager.swift

@@ -848,6 +848,10 @@ open class SessionManager {
         do {
             let task = try originalTask.task(session: session, adapter: adapter, queue: queue)
 
+            if let originalTask = request.task {
+                delegate[originalTask] = nil // removes the old request to avoid endless growth
+            }
+
             request.delegate.task = task // resets all task delegate data
 
             request.retryCount += 1

+ 6 - 0
Tests/SessionManagerTests.swift

@@ -603,6 +603,7 @@ class SessionManagerTestCase: BaseTestCase {
         XCTAssertEqual(handler.retryCount, 2)
         XCTAssertEqual(request.retryCount, 1)
         XCTAssertEqual(response?.result.isSuccess, false)
+        XCTAssertTrue(sessionManager.delegate.requests.isEmpty)
     }
 
     func testThatSessionManagerCallsRequestRetrierWhenRequestInitiallyEncountersAdaptError() {
@@ -633,6 +634,7 @@ class SessionManagerTestCase: BaseTestCase {
         XCTAssertEqual(handler.adaptedCount, 2)
         XCTAssertEqual(handler.retryCount, 1)
         XCTAssertEqual(response?.result.isSuccess, true)
+        XCTAssertTrue(sessionManager.delegate.requests.isEmpty)
 
         handler.retryErrors.forEach { XCTAssertFalse($0 is AdaptError) }
     }
@@ -670,6 +672,7 @@ class SessionManagerTestCase: BaseTestCase {
         XCTAssertEqual(handler.adaptedCount, 2)
         XCTAssertEqual(handler.retryCount, 1)
         XCTAssertEqual(response?.result.isSuccess, true)
+        XCTAssertTrue(sessionManager.delegate.requests.isEmpty)
 
         handler.retryErrors.forEach { XCTAssertFalse($0 is AdaptError) }
     }
@@ -701,6 +704,7 @@ class SessionManagerTestCase: BaseTestCase {
         XCTAssertEqual(handler.adaptedCount, 2)
         XCTAssertEqual(handler.retryCount, 1)
         XCTAssertEqual(response?.result.isSuccess, true)
+        XCTAssertTrue(sessionManager.delegate.requests.isEmpty)
 
         handler.retryErrors.forEach { XCTAssertFalse($0 is AdaptError) }
     }
@@ -732,6 +736,7 @@ class SessionManagerTestCase: BaseTestCase {
         XCTAssertEqual(handler.retryCount, 1)
         XCTAssertEqual(request.retryCount, 1)
         XCTAssertEqual(response?.result.isSuccess, true)
+        XCTAssertTrue(sessionManager.delegate.requests.isEmpty)
     }
 
     func testThatRequestAdapterErrorThrowsResponseHandlerErrorWhenRequestIsRetried() {
@@ -761,6 +766,7 @@ class SessionManagerTestCase: BaseTestCase {
         XCTAssertEqual(handler.retryCount, 1)
         XCTAssertEqual(request.retryCount, 0)
         XCTAssertEqual(response?.result.isSuccess, false)
+        XCTAssertTrue(sessionManager.delegate.requests.isEmpty)
 
         if let error = response?.result.error as? AFError {
             XCTAssertTrue(error.isInvalidURLError)