Skip to content

Commit

Permalink
fix(Sheet): IOS-7725 Load icons asynchronously (#221)
Browse files Browse the repository at this point in the history
  • Loading branch information
amegias authored Sep 27, 2022
1 parent a3126d4 commit f167058
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,9 @@ extension UICatalogSheetViewController: UITableViewDataSource, UITableViewDelega
)

let viewController = SheetViewController(configuration: configuration) { sheetResponse in
print("Sheet selection response: \(sheetResponse)")
print("Sheet selection response:")
print("\tAction:\(sheetResponse.action)")
print("\tSelected ids:\(sheetResponse.selectedIds)")
}
viewController.transitioningDelegate = sheetTransitioningDelegate
viewController.modalPresentationStyle = .custom
Expand Down
22 changes: 11 additions & 11 deletions Sources/Mistica/Components/Sheet/View/SheetView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -135,17 +135,7 @@ private extension SheetView {
imageView.heightAnchor.constraint(equalToConstant: icon.size.value).isActive = true
imageView.widthAnchor.constraint(equalToConstant: icon.size.value).isActive = true
imageView.contentMode = .scaleAspectFit
if let url = URL(string: icon.url),
let data = try? Data(contentsOf: url) {
let lightImage = UIImage(data: data)
if let iconDark = icon.urlDark,
let urlDark = URL(string: iconDark),
let dataDark = try? Data(contentsOf: urlDark),
let darkImage = UIImage(data: dataDark) {
lightImage?.imageAsset?.register(darkImage, with: .init(userInterfaceStyle: .dark))
}
imageView.image = lightImage
}
load(icon: icon, in: imageView)
itemStackView.addArrangedSubview(imageView)
}

Expand Down Expand Up @@ -263,4 +253,14 @@ private extension SheetView {
}
}
}

func load(icon: SheetListRowIcon, in imageView: UIImageView) {
guard let url = URL(string: icon.url) else { return }
if let urlDark = icon.urlDark,
let urlForDarkMode = URL(string: urlDark) {
imageView.load(url: url, urlForDarkMode: urlForDarkMode)
} else {
imageView.load(url: url)
}
}
}
41 changes: 41 additions & 0 deletions Sources/Mistica/Utils/Extensions/UIImageView+URL.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// UIImageView+URL.swift
//
// Made with ❤️ by Novum
//
// Copyright © Telefonica. All rights reserved.
//

import UIKit

extension UIImageView {
/// Loads the urls asynchronously
func load(url: URL, urlForDarkMode: URL? = nil) {
DispatchQueue.global().async { [weak self] in
guard let imageData = try? Data(contentsOf: url) else { return }
if let urlForDarkMode = urlForDarkMode,
let darkImageData = try? Data(contentsOf: urlForDarkMode) {
self?.updateImage(imageData: imageData, darkImageData: darkImageData)
} else {
self?.updateImage(imageData: imageData)
}
}
}
}

private extension UIImageView {
func updateImage(imageData: Data, darkImageData: Data) {
DispatchQueue.main.async { [weak self] in
self?.image = UIImage(data: imageData)
if let darkImage = UIImage(data: darkImageData) {
self?.image?.imageAsset?.register(darkImage, with: .init(userInterfaceStyle: .dark))
}
}
}

func updateImage(imageData: Data) {
DispatchQueue.main.async { [weak self] in
self?.image = UIImage(data: imageData)
}
}
}

0 comments on commit f167058

Please sign in to comment.