5.5 C
London
Thursday, February 1, 2024

ios – Obtain and show array of UIImages SwiftUI


I’m a newbie in SwiftUI and am attempting to load and show a number of photos horizontally directly. After I debug, it seems just like the platformLogos exists and the ForEach loop is operating, however nothing seems on the display. The .border(.blue) isn’t showing both.

Any suggestion might be useful. Thanks!

import UIKit

class ImageLoader: ObservableObject {
    
    non-public static let imageCache = NSCache<AnyObject, AnyObject>()
    
    @Printed var picture: UIImage? = nil
    @Printed var photos: [UIImage]? = nil
    
    public func downloadImage(url: URL) {
        let urlString = url.absoluteString
        
        if let imageFromCache = ImageLoader.imageCache.object(forKey: urlString as AnyObject) as? UIImage {
            self.picture = imageFromCache
            return
        }
        
        URLSession.shared.dataTask(with: url) { (knowledge, res, error) in
            guard let knowledge = knowledge, let picture = UIImage(knowledge: knowledge) else {
                return
            }
            DispatchQueue.fundamental.async { [weak self] in
                ImageLoader.imageCache.setObject(picture, forKey: urlString  as AnyObject)
                self?.picture = picture
            }
        }.resume()
    }
    
    public func downloadImages(urls: [URL]) {
        for url in urls {
            let urlString = url.absoluteString
            
            if let imageFromCache = ImageLoader.imageCache.object(forKey: urlString as AnyObject) as? UIImage {
                self.photos?.append(imageFromCache)
                return
            }
            
            URLSession.shared.dataTask(with: url) { (knowledge, res, error) in
                guard let knowledge = knowledge, let picture = UIImage(knowledge: knowledge) else {
                    return
                }
                DispatchQueue.fundamental.async { [weak self] in
                    ImageLoader.imageCache.setObject(picture, forKey: urlString  as AnyObject)
                    self?.photos?.append(picture)
                }
            }.resume()
        }
    }
}
@ObservedObject var logoLoader: ImageLoader = ImageLoader()
@ObservedObject var gameDetail: GameDetail = GameDetail()

var physique: some View {
    VStack (alignment: .main) {
        platformLogoView(platformLogos: self.logoLoader.photos)
        .onAppear {
            if let logoURLs = self.gameDetail.sport?.platformLogosUrls {
                self.logoLoader.downloadImages(urls: logoURLs)
            }
        }
    }
}
struct platformLogoView: View {
    var platformLogos: [UIImage]?
    let rows = [GridItem(.fixed(30)), GridItem(.fixed(30))]
    
    var physique: some View {
        Grid {
            ForEach(platformLogos ?? [UIImage](), id: .self ) { emblem in
                GridRow {
                    Picture(uiImage: emblem)
                        .resizable(resizingMode: Picture.ResizingMode.stretch)
                        .aspectRatio(contentMode: .match)
                        .clipped()
                }
                Divider()
            }
        }
        .border(.blue)
    }
}

I created the downloadImages operate and easily adopted the identical logic because the singular downloadImage operate, however appending the loaded picture to an array. I used to be considering of utilizing lazyHGrid as an alternative of Grid however neither of them labored. I’m merely not seeing something on display.

Latest news
Related news

LEAVE A REPLY

Please enter your comment!
Please enter your name here