| | |
| | | /// - 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: ((UIImage?) -> Void)? = 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 = data, |
| | | let data, |
| | | let image = UIImage(data: data) else { |
| | | completionHandler?(nil) |
| | | Task { |
| | | await completionHandler?(nil) |
| | | } |
| | | return |
| | | } |
| | | DispatchQueue.main.async { [unowned self] in |