Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature response delegate #2048

Merged
merged 2 commits into from Mar 24, 2023
Merged

Feature response delegate #2048

merged 2 commits into from Mar 24, 2023

Conversation

onevcat
Copy link
Owner

@onevcat onevcat commented Mar 16, 2023

A generic way to implement #2043

This adds a delegate method below:

protocol ImageDownloaderDelegate {
    func imageDownloader(
        _ downloader: ImageDownloader,
        didReceive response: URLResponse,
        completionHandler: @escaping (URLSession.ResponseDisposition) -> Void)
}

It is not possible to setup a delegate for the ImageDownloader and determine a response disposition when a response is received. Some example usage:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        ImageDownloader.default.delegate = self
    }
}

extension ViewController: ImageDownloaderDelegate {
    func imageDownloader(_ downloader: ImageDownloader, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
        guard let httpResponse = response as? HTTPURLResponse else {
            completionHandler(.cancel)
            return
        }
        let value = httpResponse.value(forHTTPHeaderField: "content-type")

        // Only allow JPEG images, based on the response header.
        completionHandler(value == "image/jpeg" ? . allow : .cancel)
    }
}

Now, loading a PNG:

KF.url(somePNGImageURL)
    .onFailure { err in print("Error: \(err)") }

Will give you a ResponseErrorReason.cancelledByDelegate error.

@rztime
Copy link

rztime commented Mar 17, 2023

guard let httpResponse = response as? HTTPURLResponse else {
    completionHandler(.cancel)
    return
}
let value = httpResponse.value(forHTTPHeaderField: "content-type")
completionHandler(value == "image/jpeg" ? . allow : .cancel)

这里建议直接使用

let value = response.mimeType

当url为本地file:///xxxx.jpeg的图片时,response 不是一个 HTTPURLResponse 会导致错误行为

@onevcat
Copy link
Owner Author

onevcat commented Mar 24, 2023

这里只是一个可行示例,ImageDownloaderDelegate 中的相关方法可由使用方进行具体实现。

@onevcat onevcat merged commit 9375e4a into master Mar 24, 2023
8 checks passed
@onevcat onevcat deleted the feature/response-delegate branch March 24, 2023 14:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants