Răsfoiți Sursa

Add an option for local file loading

onevcat 4 ani în urmă
părinte
comite
70ef0ba088

+ 10 - 2
Sources/General/ImageSource/ImageDataProvider.swift

@@ -70,6 +70,7 @@ public struct LocalFileImageDataProvider: ImageDataProvider {
 
 
     /// The file URL from which the image be loaded.
     /// The file URL from which the image be loaded.
     public let fileURL: URL
     public let fileURL: URL
+    private let loadingQueue: ExecutionQueue
 
 
     // MARK: Initializers
     // MARK: Initializers
 
 
@@ -79,9 +80,16 @@ public struct LocalFileImageDataProvider: ImageDataProvider {
     ///   - fileURL: The file URL from which the image be loaded.
     ///   - fileURL: The file URL from which the image be loaded.
     ///   - cacheKey: The key is used for caching the image data. By default,
     ///   - cacheKey: The key is used for caching the image data. By default,
     ///               the `absoluteString` of `fileURL` is used.
     ///               the `absoluteString` of `fileURL` is used.
-    public init(fileURL: URL, cacheKey: String? = nil) {
+    ///   - loadingQueue: The queue where the file loading should happen. By default, the dispatch queue of
+    ///                   `.global(qos: .userInitiated)` will be used.
+    public init(
+        fileURL: URL,
+        cacheKey: String? = nil,
+        loadingQueue: ExecutionQueue = .dispatch(DispatchQueue.global(qos: .userInitiated))
+    ) {
         self.fileURL = fileURL
         self.fileURL = fileURL
         self.cacheKey = cacheKey ?? fileURL.absoluteString
         self.cacheKey = cacheKey ?? fileURL.absoluteString
+        self.loadingQueue = loadingQueue
     }
     }
 
 
     // MARK: Protocol Conforming
     // MARK: Protocol Conforming
@@ -90,7 +98,7 @@ public struct LocalFileImageDataProvider: ImageDataProvider {
     public var cacheKey: String
     public var cacheKey: String
 
 
     public func data(handler:@escaping (Result<Data, Error>) -> Void) {
     public func data(handler:@escaping (Result<Data, Error>) -> Void) {
-        DispatchQueue.global(qos: .userInitiated).async {
+        loadingQueue.execute {
             handler(Result(catching: { try Data(contentsOf: fileURL) }))
             handler(Result(catching: { try Data(contentsOf: fileURL) }))
         }
         }
     }
     }

+ 2 - 0
Sources/Utility/CallbackQueue.swift

@@ -26,6 +26,8 @@
 
 
 import Foundation
 import Foundation
 
 
+public typealias ExecutionQueue = CallbackQueue
+
 /// Represents callback queue behaviors when an calling of closure be dispatched.
 /// Represents callback queue behaviors when an calling of closure be dispatched.
 ///
 ///
 /// - asyncMain: Dispatch the calling to `DispatchQueue.main` with an `async` behavior.
 /// - asyncMain: Dispatch the calling to `DispatchQueue.main` with an `async` behavior.

+ 20 - 0
Tests/KingfisherTests/ImageDataProviderTests.swift

@@ -49,6 +49,26 @@ class ImageDataProviderTests: XCTestCase {
         waitForExpectations(timeout: 1, handler: nil)
         waitForExpectations(timeout: 1, handler: nil)
     }
     }
     
     
+    func testLocalFileImageDataProviderMainQueue() {
+        let fm = FileManager.default
+        let document = try! fm.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
+        let fileURL = document.appendingPathComponent("test")
+        try! testImageData.write(to: fileURL)
+        
+        let provider = LocalFileImageDataProvider(fileURL: fileURL, loadingQueue: .mainCurrentOrAsync)
+        XCTAssertEqual(provider.cacheKey, fileURL.absoluteString)
+        XCTAssertEqual(provider.fileURL, fileURL)
+        
+        var called = false
+        provider.data { result in
+            XCTAssertEqual(result.value, testImageData)
+            try! fm.removeItem(at: fileURL)
+            called = true
+        }
+
+        XCTAssertTrue(called)
+    }
+    
     func testBase64ImageDataProvider() {
     func testBase64ImageDataProvider() {
         let base64String = testImageData.base64EncodedString()
         let base64String = testImageData.base64EncodedString()
         let provider = Base64ImageDataProvider(base64String: base64String, cacheKey: "123")
         let provider = Base64ImageDataProvider(base64String: base64String, cacheKey: "123")