Browse Source

public形式

Jack 4 years ago
parent
commit
d5a593aad3

+ 7 - 1
Sources/Networking/ImageDownloader.swift

@@ -127,6 +127,13 @@ open class ImageDownloader {
             session = URLSession(configuration: sessionConfiguration, delegate: sessionDelegate, delegateQueue: nil)
         }
     }
+    var sessionDelegate: SessionDelegate {
+        didSet {
+            session.invalidateAndCancel()
+            session = URLSession(configuration: sessionConfiguration, delegate: sessionDelegate, delegateQueue: nil)
+            setupSessionHandler()
+        }
+    }
     
     /// Whether the download requests should use pipeline or not. Default is false.
     open var requestsUsePipelining = false
@@ -139,7 +146,6 @@ open class ImageDownloader {
     open weak var authenticationChallengeResponder: AuthenticationChallengeResponsable?
 
     private let name: String
-    private let sessionDelegate: SessionDelegate
     private var session: URLSession
 
     // MARK: Initializers

+ 7 - 7
Sources/Networking/SessionDelegate.swift

@@ -28,7 +28,7 @@ import Foundation
 
 // Represents the delegate object of downloader session. It also behave like a task manager for downloading.
 @objc(KFSessionDelegate) // Fix for ObjC header name conflicting. https://github.com/onevcat/Kingfisher/issues/1530
-class SessionDelegate: NSObject {
+public class SessionDelegate: NSObject {
 
     typealias SessionChallengeFunc = (
         URLSession,
@@ -149,7 +149,7 @@ class SessionDelegate: NSObject {
 
 extension SessionDelegate: URLSessionDataDelegate {
 
-    func urlSession(
+    public func urlSession(
         _ session: URLSession,
         dataTask: URLSessionDataTask,
         didReceive response: URLResponse,
@@ -172,7 +172,7 @@ extension SessionDelegate: URLSessionDataDelegate {
         completionHandler(.allow)
     }
 
-    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
+    public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
         guard let task = self.task(for: dataTask) else {
             return
         }
@@ -186,7 +186,7 @@ extension SessionDelegate: URLSessionDataDelegate {
         }
     }
 
-    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
+    public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
         guard let sessionTask = self.task(for: task) else { return }
 
         if let url = sessionTask.originalURL {
@@ -214,7 +214,7 @@ extension SessionDelegate: URLSessionDataDelegate {
         onCompleted(task: task, result: result)
     }
 
-    func urlSession(
+    public func urlSession(
         _ session: URLSession,
         didReceive challenge: URLAuthenticationChallenge,
         completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
@@ -222,7 +222,7 @@ extension SessionDelegate: URLSessionDataDelegate {
         onReceiveSessionChallenge.call((session, challenge, completionHandler))
     }
 
-    func urlSession(
+    public func urlSession(
         _ session: URLSession,
         task: URLSessionTask,
         didReceive challenge: URLAuthenticationChallenge,
@@ -231,7 +231,7 @@ extension SessionDelegate: URLSessionDataDelegate {
         onReceiveSessionTaskChallenge.call((session, task, challenge, completionHandler))
     }
     
-    func urlSession(
+    public func urlSession(
         _ session: URLSession,
         task: URLSessionTask,
         willPerformHTTPRedirection response: HTTPURLResponse,

+ 25 - 0
Tests/KingfisherTests/ImageDownloaderTests.swift

@@ -547,6 +547,31 @@ class ImageDownloaderTests: XCTestCase {
         XCTAssertEqual(task?.sessionTask.task.priority, URLSessionTask.highPriority)
         waitForExpectations(timeout: 3, handler: nil)
     }
+    
+    
+    func testSessionDelegate() {
+        let extensionDelegate = ExtensionDelegate(expectation(description: #function))
+        downloader.sessionDelegate = extensionDelegate
+
+        let url = testURLs[0]
+        stub(url, data: testImageData)
+        downloader.downloadImage(with: url) { result in
+            XCTAssertNotNil(result.value)
+        }
+        waitForExpectations(timeout: 3, handler: nil)
+    }
+}
+
+class ExtensionDelegate:SessionDelegate {
+    //'exp' only for test
+    public let exp:XCTestExpectation
+    init(_ expectation:XCTestExpectation) {
+        exp = expectation
+    }
+    func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
+        exp.fulfill()
+        print(exp)
+    }
 }
 
 extension ImageDownloaderTests: ImageDownloaderDelegate {