// UIImageViewExtensions.swift - Copyright 2024 SwifterSwift
|
|
#if canImport(UIKit) && !os(watchOS)
|
import UIKit
|
|
// MARK: - Methods
|
|
public extension UIImageView {
|
/// SwifterSwift: Set image from a URL.
|
///
|
/// - Parameters:
|
/// - url: URL of image.
|
/// - contentMode: imageView content mode (default is .scaleAspectFit).
|
/// - placeHolder: optional placeholder image
|
/// - completionHandler: optional completion handler to run when download finishes (default is nil).
|
@available(iOS 13.0, macCatalyst 13.1, tvOS 13.0, *)
|
func download(
|
from url: URL,
|
contentMode: UIView.ContentMode = .scaleAspectFit,
|
placeholder: UIImage? = nil,
|
completionHandler: (@MainActor (UIImage?) -> Void)? = nil) {
|
image = placeholder
|
self.contentMode = contentMode
|
URLSession.shared.dataTask(with: url) { data, response, _ in
|
guard
|
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
|
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
|
let data,
|
let image = UIImage(data: data) else {
|
Task {
|
await completionHandler?(nil)
|
}
|
return
|
}
|
DispatchQueue.main.async { [unowned self] in
|
self.image = image
|
completionHandler?(image)
|
}
|
}.resume()
|
}
|
}
|
|
#endif
|