Basic NetworkImage support for SwiftUI via Kingfisher
June 7, 2019 ยท View on GitHub
import SwiftUI import Kingfisher import UIKit
public struct NetworkImage: SwiftUI.View {
// swiftlint:disable:next redundant_optional_initialization @State private var image: UIImage? = nil
public let imageURL: URL? public let placeholderImage: UIImage public let animation: Animation = .basic()
public var body: some SwiftUI.View { Image(uiImage: image ?? placeholderImage) .resizable() .onAppear(perform: loadImage) .transition(.opacity) .id(image ?? placeholderImage) }
private func loadImage() { guard let imageURL = imageURL, image == nil else { return } KingfisherManager.shared.retrieveImage(with: imageURL) { result in switch result { case .success(let imageResult): withAnimation(self.animation) { self.image = imageResult.image } case .failure: break } } } }
#if DEBUG // swiftlint:disable:next type_name struct NetworkImage_Previews: PreviewProvider { static var previews: some SwiftUI.View { NetworkImage(imageURL: URL(string: "https://www.apple.com/favicon.ico")!, placeholderImage: UIImage(systemName: "bookmark")!) } } #endif