İçeriğe geç

SwiftUI ile App Store RSS veri çekmek

Merhabalar bu yazımda SwiftUI ile birlikte kullandığımız bir çok nesneyi ve request işlemi yaparak App Store RSS json verisini birlikte kullanacağız.

Bu paylaşacağım örnek ile SwiftUI 2 ile birlikte bizimle olacak bir çok yeniliği aynı örnek içinde görebileceksiniz. Aynı zamanda request ve decode işlemi ile basit bir View Model yapısı kullanarak verimizi arayüz içerisinde kullanacağız.

İlk olarak RSS Data modelimizi oluşturalım.

struct AppStoreModel: Codable {
    let feed: Feed?
}

// MARK: - Feed
struct Feed: Codable {
    let title: String?
    let id: String?
    let author: Author?
    let links: [Link]?
    let copyright, country: String?
    let icon: String?
    let updated: String?
    let results: [Result]?
}

// MARK: - Author
struct Author: Codable {
    let name: String?
    let uri: String?
}

// MARK: - Link
struct Link: Codable {
    let linkSelf: String?
    let alternate: String?
}

// MARK: - Result
struct Result: Codable, Hashable {
    let artistName, id, releaseDate, name: String?
    let copyright, artistID: String?
    let artistURL: String?
    let artworkUrl100: String?
    let url: String?
}

Daha sonrasında basit bir View model ve burada gerekli fonksiyon içerisinde istek yollayarak JSON Decode işlemini gerçekleştirelim.

class ContentViewModel: ObservableObject {
    
    @Published var results: [Result] = []
    
    init() {
        fetchData()
    }
    
    func fetchData() {
        guard let storeUrl = URL(string:"https://rss.itunes.apple.com/api/v1/tr/ios-apps/top-free/all/100/explicit.json") else {
            return
        }
        URLSession.shared.dataTask(with: storeUrl) { (data, res, error) in
            guard let data = data else { return }
            do {
                let rssData = try JSONDecoder().decode(AppStoreModel.self, from: data)
                if let storeResult = rssData.feed?.results {
                    DispatchQueue.main.async {
                        self.results = storeResult
                    }
                }
            } catch {
                print("Fetch failed @@")
            }
        }.resume()
    }
}

Burada fetch aksiyonu nesne yaratıldığı zaman gerçekleşir. Dilerseniz siz View içerisinde .onAppear bloğunda fetch işlemi gerçekleştirebilirsiniz.

struct ContentView: View {
    
    @ObservedObject var VM = ContentViewModel()
    
    var body: some View {
        NavigationView {
            if VM.results.isEmpty {
                ProgressView()
                    .scaleEffect(2)
            } else {
                ScrollView {
                    LazyVGrid(columns: [
                        GridItem(.flexible(minimum: 50, maximum: 100), spacing: 14, alignment: .top),
                        GridItem(.flexible(minimum: 50, maximum: 100), spacing: 14, alignment: .top),
                        GridItem(.flexible(minimum: 50, maximum: 100), spacing: 14, alignment: .top)
                    ], spacing: 20, content: {
                        ForEach(VM.results, id: \.self) { item in
                            AppStoreItem(result: item)
                        }
                    })
                    .padding(.horizontal, 10)
                }
                .padding(.top, 12)
                .navigationTitle("App Store")
            }
        }
    }
}
struct AppStoreItem: View {
    
    var result: Result
    
    var body: some View {
        VStack(alignment: .leading) {
            WebImage(url: URL(string: result.artworkUrl100 ?? ""))
                .resizable()
                .frame(width: 100, height: 100, alignment: .center)
                .cornerRadius(12)
            VStack(alignment: .leading, spacing: 5) {
                Text(result.name!)
                    .font(.system(size: 12))
                    .fontWeight(.bold)
                    .foregroundColor(.black)
                    .lineLimit(2)
                Text(result.artistName!)
                    .font(.system(size: 9))
                    .fontWeight(.medium)
                    .foregroundColor(.gray)
                    .lineLimit(2)
            }
        }
    }
}

Not: Resimleri fetch ederken, Swift Package Manager ile birlikte SDWebImageSwiftUI kullanılmıştır.

 

 

 

Tarih:SwiftUI

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Copyright © 2020 Kenan Atmaca