Tarmoq bilan ishlash
Tarmoq bilan ishlash (URLSession)
URLSession va async/await yordamida HTTPS orqali JSON oling va yuboring hamda javoblarni SwiftUI ga integratsiya qiling.
async/await bilan GET so‘rovi
Ma’lumotlarni olish uchun URLSession.shared.data(from:) ni async/await bilan birga ishlating.
Sintaksis:
let (data, response) = try await URLSession.shared.data(from: url)JSONDecoder().decodeyordamida dekodlang
Misol
import SwiftUI
import Foundation
struct Todo: Decodable, Identifiable { let id: Int; let title: String }
func fetchTodos() async throws -> [Todo] {
let url = URL(string: "https://jsonplaceholder.typicode.com/todos?_limit=2")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode([Todo].self, from: data)
}
struct NetworkingGetDemo: View {
@State private var todos: [Todo] = []
var body: some View {
List(todos) { t in Text(t.title) }
.task {
do { todos = try await fetchTodos() } catch { print(error) }
}
}
}
import SwiftUI
struct ContentView: View {
var body: some View { NetworkingGetDemo() }
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
Ushbu misol async/await yordamida URLSession orqali kichik JSON ro‘yxatini oladi va uni SwiftUI List’da ko‘rsatadi.
Namunaviy ilova: Notes (tarmoq bilan ishlash)
Vazifalarni ajratish va ma’lumotlarni fonda yuklash uchun @MainActor class VM: ObservableObject { @Published var items: [T] = []; func loadFromAPI() async { ... } } dan foydalaning.
Sintaksis:
@MainActor class VM: ObservableObject { @Published var items: [T] = []; func loadFromAPI() async { ... } }- View: asinxron yuklashni boshlash uchun
.task { await vm.loadFromAPI() } - API:
let (data, _) = try await URLSession.shared.data(from: url),JSONDecoder().decode
Misol
import SwiftUI
import Foundation
struct NoteDTO: Decodable, Identifiable { let id: Int; let title: String; let body: String }
enum API {
static func fetchNotes() async throws -> [NoteDTO] {
let url = URL(string: "https://jsonplaceholder.typicode.com/posts?_limit=3")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode([NoteDTO].self, from: data)
}
}
@MainActor
final class NotesViewModel: ObservableObject {
@Published var notes: [NoteDTO] = []
func loadFromAPI() async {
do { notes = try await API.fetchNotes() }
catch { print(error) }
}
}
struct NotesView: View {
@StateObject private var vm = NotesViewModel()
var body: some View {
List(vm.notes) { n in Text(n.title) }
.task { await vm.loadFromAPI() }
}
}
import SwiftUI
struct ContentView: View {
var body: some View { NotesView() }
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
Ushbu misol vazifalarni API yordamchisi va ViewModel yordamida ajratadi, so‘ng task ishga tushganda qaydlarni SwiftUI List’ga yuklaydi.
POST orqali JSON yuborish
Ma’lumotlarni (payload) kodlab, so‘rov metodi va sarlavhalarini (headers) belgilash orqali JSON yuboring.
Sintaksis:
var req = URLRequest(url:)req.httpMethod = "POST"req.setValue("application/json", forHTTPHeaderField: "Content-Type")req.httpBody = try JSONEncoder().encode(payload)let (_, resp) = try await URLSession.shared.data(for: req)
Misol
import SwiftUI
import Foundation
struct NewTodo: Encodable { let title: String; let completed: Bool }
func createTodo(_ todo: NewTodo) async throws -> Int {
let url = URL(string: "https://jsonplaceholder.typicode.com/todos")!
var req = URLRequest(url: url)
req.httpMethod = "POST"
req.setValue("application/json", forHTTPHeaderField: "Content-Type")
req.httpBody = try JSONEncoder().encode(todo)
let (_, resp) = try await URLSession.shared.data(for: req)
return (resp as? HTTPURLResponse)?.statusCode ?? 0
}
struct NetworkingPostDemo: View {
@State private var status: Int? = nil
var body: some View {
VStack(spacing: 12) {
Button("Create Todo") {
Task {
do { status = try await createTodo(NewTodo(title: "Demo", completed: false)) }
catch { print(error); status = nil }
}
}
if let status { Text("Status: \(status)") }
}
.padding()
}
}
import SwiftUI
struct ContentView: View {
var body: some View { NetworkingPostDemo() }
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
Ushbu misol POST so‘rovi bilan JSON ma’lumotlarini (payload) yuboradi va javobdagi HTTP status kodini qaytaradi.
Maslahat: Info.plist ga App Transport Security istisnolarini faqat zarur bo‘lganda qo‘shing.
HTTPS’ni afzal ko‘ring.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
