Selam dostlar, Apple tarafından 15 Ekim tarihinde yayınlanan istatistiklere göre IOS 13 kullanımı tüm Apple cihazların %50’sinden fazlasında kullanılmaya başlandı bile.

Dolayısıyla geçtiğimiz aylarda yüzünü gösteren SwiftUI için çalışmalarımızı hızlandırma zamanı. Boş kaldıkça ufak tefek denemeler, kurcalamalar yaptığım SwiftUI ile ilgili örnekleri de elimden geldiğince burada paylaşmaya çalışacağım.

Şimdi gelelim SwiftUI ile uzak siteden json veri çekme ve parse etme olayına.

SwiftUI Fetch Remote Json And Parse

Öncelikle data modelimiz için struct oluşturalım.

import Foundation
struct Movie: Decodable, Identifiable {

    public var id: Int
    public var name: String
    public var released: String

    enum CodingKeys: String, CodingKey {
       case id = "id"
       case name = "title"
       case released = "year"
    }
}

Sonrasında JSON verimizi çekelim ve modelimize göre parse edelim.

import Foundation
public class MovieFetcher: ObservableObject {

    @Published var movies = [Movie]()

    init(){
        // load()
    }

    func load() {
        let url = URL(string: "https://gist.githubusercontent.com/rbreve/60eb5f6fe49d5f019d0c39d71cb8388d/raw/f6bc27e3e637257e2f75c278520709dd20b1e089/movies.json")!

        URLSession.shared.dataTask(with: url) {(data,response,error) in
            do {
                if let d = data {
                    let decodedLists = try JSONDecoder().decode([Movie].self, from: d)
                    DispatchQueue.main.async {
                        self.movies = decodedLists
                    }
                }else {
                    print("No Data")
                }
            } catch {
                print ("Error")
            }

        }.resume()

    }
}

Ve son aşama, verilerimizi listeleyelim.

import SwiftUI

struct ContentView: View {

    @ObservedObject var fetcher = MovieFetcher()

    var body: some View {
        VStack {

            Button(action: {
                self.fetcher.movies = []
                self.fetcher.load()
            }) {
                Text("Getir")
            }.padding()

            List(fetcher.movies) { movie in
                VStack (alignment: .leading) {
                    Text(movie.name)
                    Text(movie.released)
                        .font(.system(size: 11))
                        .foregroundColor(Color.gray)
                }
            }

        }
    }
}

Bu içerik https://medium.com/@rbreve kullanıcısından alınarak çalıştığı test edilmiş ve Türkçe olarak yayınlanmıştır.

Bir cevap yazın

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