Browse Source

图片下载增加接收数据回调

lixiang1994 6 years ago
parent
commit
40ab19253d

+ 1 - 1
Podfile.lock

@@ -19,4 +19,4 @@ SPEC CHECKSUMS:
 
 PODFILE CHECKSUM: e1701972032ff803969f497525d8e4aa8929f695
 
-COCOAPODS: 1.6.0.beta.1
+COCOAPODS: 1.6.1

+ 1 - 1
Pods/Manifest.lock

@@ -19,4 +19,4 @@ SPEC CHECKSUMS:
 
 PODFILE CHECKSUM: e1701972032ff803969f497525d8e4aa8929f695
 
-COCOAPODS: 1.6.0.beta.1
+COCOAPODS: 1.6.1

File diff suppressed because it is too large
+ 669 - 712
Pods/Pods.xcodeproj/project.pbxproj


+ 55 - 1
Pods/Target Support Files/Pods-KingfisherTests-macOS/Pods-KingfisherTests-macOS-acknowledgements.plist

@@ -1,5 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
-<string></string>
+<dict>
+	<key>PreferenceSpecifiers</key>
+	<array>
+		<dict>
+			<key>FooterText</key>
+			<string>This application makes use of the following third party libraries:</string>
+			<key>Title</key>
+			<string>Acknowledgements</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2012 Luis Solano Bonet
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>Nocilla</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Generated by CocoaPods - https://cocoapods.org</string>
+			<key>Title</key>
+			<string></string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+	</array>
+	<key>StringsTable</key>
+	<string>Acknowledgements</string>
+	<key>Title</key>
+	<string>Acknowledgements</string>
+</dict>
 </plist>

+ 0 - 1
Pods/Target Support Files/Pods-KingfisherTests-macOS/Pods-KingfisherTests-macOS.debug.xcconfig

@@ -1,7 +1,6 @@
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Nocilla"
 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nocilla-macOS"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Nocilla"
 OTHER_LDFLAGS = $(inherited) -ObjC -l"Nocilla-macOS" -framework "CFNetwork"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 0 - 1
Pods/Target Support Files/Pods-KingfisherTests-macOS/Pods-KingfisherTests-macOS.release.xcconfig

@@ -1,7 +1,6 @@
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Nocilla"
 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nocilla-macOS"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Nocilla"
 OTHER_LDFLAGS = $(inherited) -ObjC -l"Nocilla-macOS" -framework "CFNetwork"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 55 - 1
Pods/Target Support Files/Pods-KingfisherTests-tvOS/Pods-KingfisherTests-tvOS-acknowledgements.plist

@@ -1,5 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
-<string></string>
+<dict>
+	<key>PreferenceSpecifiers</key>
+	<array>
+		<dict>
+			<key>FooterText</key>
+			<string>This application makes use of the following third party libraries:</string>
+			<key>Title</key>
+			<string>Acknowledgements</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2012 Luis Solano Bonet
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>Nocilla</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Generated by CocoaPods - https://cocoapods.org</string>
+			<key>Title</key>
+			<string></string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+	</array>
+	<key>StringsTable</key>
+	<string>Acknowledgements</string>
+	<key>Title</key>
+	<string>Acknowledgements</string>
+</dict>
 </plist>

+ 0 - 1
Pods/Target Support Files/Pods-KingfisherTests-tvOS/Pods-KingfisherTests-tvOS.debug.xcconfig

@@ -1,7 +1,6 @@
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Nocilla"
 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nocilla-tvOS"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Nocilla"
 OTHER_LDFLAGS = $(inherited) -ObjC -l"Nocilla-tvOS" -framework "CFNetwork"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 0 - 1
Pods/Target Support Files/Pods-KingfisherTests-tvOS/Pods-KingfisherTests-tvOS.release.xcconfig

@@ -1,7 +1,6 @@
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Nocilla"
 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nocilla-tvOS"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Nocilla"
 OTHER_LDFLAGS = $(inherited) -ObjC -l"Nocilla-tvOS" -framework "CFNetwork"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 55 - 1
Pods/Target Support Files/Pods-KingfisherTests/Pods-KingfisherTests-acknowledgements.plist

@@ -1,5 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
-<string></string>
+<dict>
+	<key>PreferenceSpecifiers</key>
+	<array>
+		<dict>
+			<key>FooterText</key>
+			<string>This application makes use of the following third party libraries:</string>
+			<key>Title</key>
+			<string>Acknowledgements</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2012 Luis Solano Bonet
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>Nocilla</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Generated by CocoaPods - https://cocoapods.org</string>
+			<key>Title</key>
+			<string></string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+	</array>
+	<key>StringsTable</key>
+	<string>Acknowledgements</string>
+	<key>Title</key>
+	<string>Acknowledgements</string>
+</dict>
 </plist>

+ 0 - 1
Pods/Target Support Files/Pods-KingfisherTests/Pods-KingfisherTests.debug.xcconfig

@@ -1,7 +1,6 @@
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Nocilla"
 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nocilla-iOS"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Nocilla"
 OTHER_LDFLAGS = $(inherited) -ObjC -l"Nocilla-iOS" -framework "CFNetwork"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 0 - 1
Pods/Target Support Files/Pods-KingfisherTests/Pods-KingfisherTests.release.xcconfig

@@ -1,7 +1,6 @@
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Nocilla"
 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Nocilla-iOS"
-OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Nocilla"
 OTHER_LDFLAGS = $(inherited) -ObjC -l"Nocilla-iOS" -framework "CFNetwork"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 8 - 0
Sources/General/KingfisherManager.swift

@@ -27,6 +27,8 @@
 
 import Foundation
 
+public typealias DownloadReceivedBlock = ((_ latestData: Data, _ receivedData: Data) -> Void)
+
 /// The downloading progress block type.
 /// The parameter value is the `receivedSize` of current response.
 /// The second parameter is the total expected data length from response's "Content-Length" header.
@@ -161,6 +163,7 @@ public class KingfisherManager {
     func retrieveImage(
         with source: Source,
         options: KingfisherParsedOptionsInfo,
+        receivedBlock: DownloadReceivedBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
     {
@@ -168,8 +171,10 @@ public class KingfisherManager {
             return loadAndCacheImage(
                 source: source,
                 options: options,
+                receivedBlock: receivedBlock,
                 progressBlock: progressBlock,
                 completionHandler: completionHandler)?.value
+            
         } else {
             let loadedFromCache = retrieveImageFromCache(
                 source: source,
@@ -189,6 +194,7 @@ public class KingfisherManager {
             return loadAndCacheImage(
                 source: source,
                 options: options,
+                receivedBlock: receivedBlock,
                 progressBlock: progressBlock,
                 completionHandler: completionHandler)?.value
         }
@@ -235,6 +241,7 @@ public class KingfisherManager {
     func loadAndCacheImage(
         source: Source,
         options: KingfisherParsedOptionsInfo,
+        receivedBlock: DownloadReceivedBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask.WrappedTask?
     {
@@ -285,6 +292,7 @@ public class KingfisherManager {
             guard let task = downloader.downloadImage(
                 with: resource.downloadURL,
                 options: options,
+                receivedBlock: receivedBlock,
                 progressBlock: progressBlock,
                 completionHandler: cacheImage) else
             {

+ 6 - 4
Sources/Image/ImageDrawing.swift

@@ -149,10 +149,12 @@ extension KingfisherWrapper where Base: Image {
                 rectPath.fill()
             }
             
-            let path = UIBezierPath(roundedRect: rect,
-                                    byRoundingCorners: corners.uiRectCorner,
-                                    cornerRadii: CGSize(width: radius, height: radius)).cgPath
-            context.addPath(path)
+            let path = UIBezierPath(
+                roundedRect: rect,
+                byRoundingCorners: corners.uiRectCorner,
+                cornerRadii: CGSize(width: radius, height: radius)
+            )
+            context.addPath(path.cgPath)
             context.clip()
             base.draw(in: rect)
             #endif

+ 56 - 5
Sources/Image/ImageFormat.swift

@@ -48,6 +48,35 @@ public enum ImageFormat {
         static var JPEG_IF: [UInt8] = [0xFF]
         static var GIF: [UInt8] = [0x47, 0x49, 0x46]
     }
+    
+    /// https://en.wikipedia.org/wiki/JPEG
+    public enum JPEGMarker {
+        case SOF0           //baseline
+        case SOF2           //progressive
+        case DHT            //Huffman Table
+        case DQT            //Quantization Table
+        case DRI            //Restart Interval
+        case SOS            //Start Of Scan
+        case RSTn(UInt8)    //Restart
+        case APPn           //Application-specific
+        case COM            //Comment
+        case EOI            //End Of Image
+        
+        var bytes: [UInt8] {
+            switch self {
+            case .SOF0:         return [0xFF, 0xC0]
+            case .SOF2:         return [0xFF, 0xC2]
+            case .DHT:          return [0xFF, 0xC4]
+            case .DQT:          return [0xFF, 0xDB]
+            case .DRI:          return [0xFF, 0xDD]
+            case .SOS:          return [0xFF, 0xDA]
+            case .RSTn(let n):  return [0xFF, 0xD0 + n]
+            case .APPn:         return [0xFF, 0xE0]
+            case .COM:          return [0xFF, 0xFE]
+            case .EOI:          return [0xFF, 0xD9]
+            }
+        }
+    }
 }
 
 
@@ -58,16 +87,19 @@ extension KingfisherWrapper where Base == Data {
     /// Gets the image format corresponding to the data.
     public var imageFormat: ImageFormat {
         var buffer = [UInt8](repeating: 0, count: 8)
-        (base as NSData).getBytes(&buffer, length: 8)
+        base.copyBytes(to: &buffer, count: 8)
+        
         if buffer == ImageFormat.HeaderData.PNG {
             return .PNG
-        } else if buffer[0] == ImageFormat.HeaderData.JPEG_SOI[0] &&
-            buffer[1] == ImageFormat.HeaderData.JPEG_SOI[1] &&
+            
+        } else if buffer[0] == ImageFormat.HeaderData.JPEG_SOI[0],
+            buffer[1] == ImageFormat.HeaderData.JPEG_SOI[1],
             buffer[2] == ImageFormat.HeaderData.JPEG_IF[0]
         {
             return .JPEG
-        } else if buffer[0] == ImageFormat.HeaderData.GIF[0] &&
-            buffer[1] == ImageFormat.HeaderData.GIF[1] &&
+            
+        } else if buffer[0] == ImageFormat.HeaderData.GIF[0],
+            buffer[1] == ImageFormat.HeaderData.GIF[1],
             buffer[2] == ImageFormat.HeaderData.GIF[2]
         {
             return .GIF
@@ -75,4 +107,23 @@ extension KingfisherWrapper where Base == Data {
         
         return .unknown
     }
+    
+    public func contains(jpeg marker: ImageFormat.JPEGMarker) -> Bool {
+        guard imageFormat == .JPEG else {
+            return false
+        }
+        
+        var buffer = [UInt8](repeating: 0, count: base.count)
+        base.copyBytes(to: &buffer, count: base.count)
+        for (index, item) in buffer.enumerated() {
+            guard
+                item == marker.bytes.first,
+                buffer.count > index + 1,
+                buffer[index + 1] == marker.bytes[1] else {
+                continue
+            }
+            return true
+        }
+        return false
+    }
 }

+ 20 - 5
Sources/Networking/ImageDownloader.swift

@@ -197,6 +197,7 @@ open class ImageDownloader {
     func downloadImage(
         with url: URL,
         options: KingfisherParsedOptionsInfo,
+        receivedBlock: DownloadReceivedBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         completionHandler: ((Result<ImageLoadingResult, KingfisherError>) -> Void)? = nil) -> DownloadTask?
     {
@@ -225,11 +226,21 @@ open class ImageDownloader {
         }
 
         // Wraps `progressBlock` and `completionHandler` to `onProgress` and `onCompleted` respectively.
+        let onReceived = receivedBlock.map {
+            block -> Delegate<(Data, Data), Void> in
+            let delegate = Delegate<(Data, Data), Void>()
+            delegate.delegate(on: self) { (_, callback) in
+                let (latest, received) = callback
+                block(latest, received)
+            }
+            return delegate
+        }
+
         let onProgress = progressBlock.map {
             block -> Delegate<(Int64, Int64), Void> in
             let delegate = Delegate<(Int64, Int64), Void>()
-            delegate.delegate(on: self) { (_, progress) in
-                let (downloaded, total) = progress
+            delegate.delegate(on: self) { (_, callback) in
+                let (downloaded, total) = callback
                 block(downloaded, total)
             }
             return delegate
@@ -238,15 +249,19 @@ open class ImageDownloader {
         let onCompleted = completionHandler.map {
             block -> Delegate<Result<ImageLoadingResult, KingfisherError>, Void> in
             let delegate =  Delegate<Result<ImageLoadingResult, KingfisherError>, Void>()
-            delegate.delegate(on: self) { (_, result) in
-                block(result)
+            delegate.delegate(on: self) { (_, callback) in
+                block(callback)
             }
             return delegate
         }
 
         // SessionDataTask.TaskCallback is a wrapper for `onProgress`, `onCompleted` and `options` (for processor info)
         let callback = SessionDataTask.TaskCallback(
-            onProgress: onProgress, onCompleted: onCompleted, options: options)
+            onReceived: onReceived,
+            onProgress: onProgress,
+            onCompleted: onCompleted,
+            options: options
+        )
 
         // Ready to start download. Add it to session task manager (`sessionHandler`)
 

+ 1 - 0
Sources/Networking/SessionDataTask.swift

@@ -34,6 +34,7 @@ public class SessionDataTask {
     public typealias CancelToken = Int
 
     struct TaskCallback {
+        let onReceived: Delegate<(Data, Data), Void>?
         let onProgress: Delegate<(Int64, Int64), Void>?
         let onCompleted: Delegate<Result<ImageLoadingResult, KingfisherError>, Void>?
         let options: KingfisherParsedOptionsInfo

+ 7 - 0
Sources/Networking/SessionDelegate.swift

@@ -175,6 +175,13 @@ extension SessionDelegate: URLSessionDataDelegate {
                 }
             }
         }
+        
+        let received = task.mutableData
+        DispatchQueue.main.async {
+            task.callbacks.forEach { callback in
+                callback.onReceived?.call((data, received))
+            }
+        }
     }
 
     func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {

Some files were not shown because too many files changed in this diff