[swift] Swift UI로 데이터를 가져오거나 업데이트하는 방법은 어떻게 되나요?

SwiftUI는 데이터를 가져오거나 업데이트하는 데 사용할 수있는 몇 가지 기능을 제공합니다. 다음은 Swift UI에서 데이터를 가져오거나 업데이트하는 방법에 대한 몇 가지 예제입니다.

데이터 가져오기

URLSession을 사용하여 데이터 가져오기

import SwiftUI

struct ContentView: View {
    @State private var data: Data?
    
    var body: some View {
        VStack {
            if let data = self.data {
                Text(String(data: data, encoding: .utf8) ?? "")
            } else {
                Text("Loading")
                    .onAppear(perform: fetchData)
            }
        }
    }
    
    func fetchData() {
        guard let url = URL(string: "https://api.example.com/data") else { return }
        
        URLSession.shared.dataTask(with: url) { (data, _, _) in
            DispatchQueue.main.async {
                self.data = data
            }
        }.resume()
    }
}

위의 예제에서는 URLSession.shared.dataTask를 사용하여 지정된 URL에서 데이터를 가져옵니다. 데이터를 가져오는 동안 “Loading” 텍스트가 표시되고, 데이터가 성공적으로 가져와지면 텍스트 뷰에 표시됩니다.

Combine을 사용하여 데이터 가져오기

import SwiftUI
import Combine

class DataModel: ObservableObject {
    @Published var data: Data?
    
    private var cancellable: AnyCancellable?
    
    init() {
        fetchData()
    }
    
    func fetchData() {
        guard let url = URL(string: "https://api.example.com/data") else { return }
        
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
            .map(\.data)
            .replaceError(with: Data())
            .receive(on: DispatchQueue.main)
            .assign(to: \.data, on: self)
    }
}

struct ContentView: View {
    @ObservedObject var dataModel = DataModel()
    
    var body: some View {
        VStack {
            if let data = dataModel.data {
                Text(String(data: data, encoding: .utf8) ?? "")
            } else {
                Text("Loading")
            }
        }
    }
}

위의 예제에서는 Combine 프레임워크를 사용하여 데이터를 가져오고, @Published 속성을 사용하여 데이터 변경을 수신하고 뷰를 업데이트합니다.

데이터 업데이트하기

URLSession을 사용하여 데이터 업데이트하기

struct ContentView: View {
    @State private var data: Data?
    @State private var newData: String = ""
    
    var body: some View {
        VStack {
            if let data = self.data {
                Text(String(data: data, encoding: .utf8) ?? "")
            } else {
                TextField("Enter data", text: $newData)
                    .padding()
                Button("Submit", action: sendData)
                    .padding()
            }
        }
    }
    
    func sendData() {
        guard let url = URL(string: "https://api.example.com/data") else { return }
        
        guard let json = try? JSONEncoder().encode(["data": newData]) else { return }
        
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = json
        
        URLSession.shared.dataTask(with: request) { _, _, _ in
            // Handle response, if needed
        }.resume()
    }
}

위의 예제에서는 POST 요청을 사용하여 사용자가 입력한 데이터를 서버로 보냅니다. TextField를 사용하여 새 데이터를 입력하고, Button을 사용하여 데이터를 서버로 보냅니다.

Combine을 사용하여 데이터 업데이트하기

class DataModel: ObservableObject {
    @Published var data: Data?
    @Published var newData: String = ""
    
    func sendData() {
        guard let url = URL(string: "https://api.example.com/data") else { return }
        
        guard let json = try? JSONEncoder().encode(["data": newData]) else { return }
        
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = json
        
        URLSession.shared.dataTaskPublisher(for: request)
            .sink(receiveCompletion: { _ in }, receiveValue: { _ in
                // Handle response, if needed
            })
            .store(in: &cancellables)
    }
}

struct ContentView: View {
    @ObservedObject var dataModel = DataModel()
    
    var body: some View {
        VStack {
            if let data = dataModel.data {
                Text(String(data: data, encoding: .utf8) ?? "")
            } else {
                TextField("Enter data", text: $dataModel.newData)
                    .padding()
                Button("Submit", action: dataModel.sendData)
                    .padding()
            }
        }
    }
}

위의 예제에서는 Combine의 dataTaskPublisher를 사용하여 POST 요청을 보냅니다. 이를 통해 데이터를 업데이트하고, TextField의 바인딩을 사용하여 새 데이터를 입력하고, Button을 사용하여 데이터를 서버로 보냅니다.

이러한 방법들을 사용하여 SwiftUI에서 데이터를 가져오거나 업데이트 할 수 있습니다. 필요에 따라 다양한 방법을 선택하여 사용할 수 있습니다.

참고: