Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. import SwiftUI
  2. import Combine
  3.  
  4. import class Kingfisher.KingfisherManager
  5.  
  6. extension Image {
  7. func remoteImage(from imageURL:URL?) -> some View {
  8. ModifiedContent(content: self, modifier: RemoteImage(loader: ImageLoader(imageURL)))
  9. }
  10. }
  11.  
  12. final class ImageLoader: ObservableObject {
  13. let imageURL: URL?
  14. @Published var image: UIImage? = nil
  15.  
  16. var objectWillChange: AnyPublisher<UIImage?, Never> = Publishers.Sequence<[UIImage?], Never>(sequence: []).eraseToAnyPublisher()
  17. var cancellable: AnyCancellable?
  18.  
  19. init(_ path: URL?) {
  20. self.imageURL = path
  21.  
  22. self.objectWillChange = $image.handleEvents(receiveSubscription: { [weak self] sub in
  23. self?.fetchImage()
  24. }, receiveCancel: { [weak self] in
  25. self?.cancellable?.cancel()
  26. }).eraseToAnyPublisher()
  27. }
  28.  
  29. private func fetchImage() {
  30. if image != nil { return }
  31.  
  32. guard let imageUrl = imageURL else {
  33. print("error with: \(String(describing: imageURL))")
  34. return
  35. }
  36.  
  37. KingfisherManager.shared.retrieveImage(with: imageUrl) { result in
  38.  
  39. switch result {
  40. case .success(let value):
  41. self.image = value.image
  42. case .failure(let error):
  43. print(error)
  44. }
  45. }
  46. }
  47. }
  48.  
  49. //MARK:- Remote image implementation
  50.  
  51. struct RemoteImage: ViewModifier {
  52. @ObservedObject var loader: ImageLoader
  53.  
  54. func body(content: Content) -> some View {
  55. // if loader.image != nil {
  56. // return Image(uiImage: loader.image!)
  57. // .resizable()
  58. // .eraseToAnyView()
  59. // } else {
  60. // return content.eraseToAnyView()
  61. // }
  62. ZStack {
  63. content
  64. .opacity( loader.image == nil ? 1 : 0)
  65. loader.image.map {
  66. Image(uiImage: $0)
  67. .resizable()
  68. .eraseToAnyView()
  69. }
  70. }
  71. }
  72. }
  73.  
  74. extension View {
  75. func eraseToAnyView() -> AnyView {
  76. return AnyView(self)
  77. }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement