본문 바로가기

아이폰

SwiftUI : display image from url (URL로 비동기 이미지 생성)

반응형

NetworkImage.swift 

 

import Combine
import SwiftUI


struct NetworkImage: View {
    @StateObject private var viewModel = ViewModel()


    let url: URL?


    var body: some View {
        Group {
            if let data = viewModel.imageData, let uiImage = UIImage(data: data) {
                Image(uiImage: uiImage)
                    .scaledToFill()
                       .frame(width: 50, height: 50, alignment: .center)
                       .clipped()
            } else if viewModel.isLoading {
                ProgressView()
            } else {
                Image(systemName: "photo")
            }
        }
        .onAppear {
            viewModel.loadImage(from: url)
        }
    }
}


extension NetworkImage {
    class ViewModel: ObservableObject {
        @Published var imageData: Data?
        @Published var isLoading = false


        private static let cache = NSCache<NSURL, NSData>()


        private var cancellables = Set<AnyCancellable>()


        func loadImage(from url: URL?) {
            isLoading = true
            guard let url = url else {
                isLoading = false
                return
            }
            if let data = Self.cache.object(forKey: url as NSURL) {
                imageData = data as Data
                isLoading = false
                return
            }
            URLSession.shared.dataTaskPublisher(for: url)
                .map { $0.data }
                .replaceError(with: nil)
                .receive(on: DispatchQueue.main)
                .sink { [weak self] in
                    if let data = $0 {
                        Self.cache.setObject(data as NSData, forKey: url as NSURL)
                        self?.imageData = data
                    }
                    self?.isLoading = false
                }
                .store(in: &cancellables)
        }
    }
}

 

 

MainView.swift

import UIKit
import SwiftUI


struct  MainView : View {


    var body: some View {
       
        VStack{
            NetworkImage(url:URL(string:"https://user-images.githubusercontent.com/14171723/38237327-ea8234e0-3761-11e8-8524-b42d30e8d834.png"))
            
            }
        }
   
 
   
}

 

반응형

'아이폰' 카테고리의 다른 글

SWIFTUI FCM , PHP 전송  (0) 2023.01.06