
ถ้าพูดถึง Web Services แบบ JSON APIs ผ่าน Web บทเรียนการเรียกข้อมูล Web API รูปแบบ JSON บน iOS ด้วย SwiftUI สำหรับดึงข้อมูลผ่านเว็บ
หลังจากศึกษาบทเรียน SwiftUI ผ่านบทความแบบเร็วๆ Advance เบาๆอย่าง
เราก็มาแบบหากินกันเลยดีกว่านั่นคือให้ไปเตรียม JSON API ตัวอย่างหรือใช้ของผมก็ได้ ผมมีเว็บรีวิวหนังอยู่ที่ URL นี้: https://enet5-7f9f6.firebaseio.com/movies.json

เปิด New Project ขึ้นมาไปที่ ContentView.swift ขึ้นมาคลิกขวาที่ Folder Project เลือก New Group ตั้งชื่อว่า “Model”

สร้าง New File (Swift File) ใน Group ของ Model ว่า Post.swift


สร้าง Group ใหม่ขึ้นมาว่า “Services”

ไปที่ Model/Post.swift ใส่คำสั่งต่อไปนี้:
import Foundation
struct Post: Codable{
let id: Int
let title: String
let thumbnail: String
}
เปิด Services.swift ขึ้นมาสร้าง Class ของ Services ใหม่ใส่คำสั่งการ Get Posts ดังนี้:
import Foundation
class Services {
func getPosts(completion: @escaping ([Post]?) -> ()) {
guard let url = URL(string: "https://enet5-7f9f6.firebaseio.com/movies.json") else {
fatalError("Invalid URL")
}
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
DispatchQueue.main.async {
completion(nil)
}
return
}
let posts = try? JSONDecoder().decode([Post].self, from: data)
DispatchQueue.main.async {
completion(posts)
}
}.resume()
}
}
สร้าง Group ใหม่ชื่อ View สร้างไฟล์ swift ใหม่ชื่อ ListViewModel.swift ขึ้นมา

สร้าง Class ของ ListViewModel ให้เรียบร้อย:
class ListViewModel: ObservableObject {
@Published var posts = [PostViewModel]()
init() {
Services().getPosts { posts in
if let posts = posts {
self.posts = posts.map(PostViewModel.init)
}
}
}
}
เพิ่ม Struct ของ PostViewModel เข้าไปใน ListViewModel.swift อีกที
struct PostViewModel {
var post: Post
init(post: Post) {
self.post = post
}
var id: Int {
return self.post.id
}
var title: String {
return self.post.title
}
var thumbnail: String {
return self.post.thumbnail
}
}
ดังนั้นใน ListViewController.swift จะเป็นดังนี้:
import Foundation
class ListViewModel: ObservableObject {
@Published var posts = [PostViewModel]()
init() {
Services().getPosts { posts in
if let posts = posts {
self.posts = posts.map(PostViewModel.init)
}
}
}
}
struct PostViewModel {
var post: Post
init(post: Post) {
self.post = post
}
var id: Int {
return self.post.id
}
var title: String {
return self.post.title
}
var thumbnail: String {
return self.post.thumbnail
}
}
ขั้นตอนสุดท้ายไปที่ ContentView เพิ่ม Global Variable ดังนี้:
@ObservedObject private var listViewModel = ListViewModel()
ใส่ Code นี้ใน body:
struct ContentView: View {
@ObservedObject private var listViewModel = ListViewModel()
var body: some View {
NavigationView {
VStack {
List(self.listViewModel.posts, id: \.id) { post in
VStack(alignment: .leading) {
Text(post.title).font(.title)
//Text(post.title)
}
}
}
.navigationBarTitle("Movie Reviews")
}
}
}
ทดสอบแอปพลิเคชันของเราดีกว่า:

ดึงข้อมูลจาก JSON ได้แล้วซึ่ง API ต้องเป็น https ด้วยนะ ลองไปเขียนดูกัน




