-
Alamofire, Combine으로 POST 데이터 불러오기GET & POST 2022. 7. 15. 12:48
디렉토리 구성 2개 패키지(Alamofire, URLImage) 추가 #1. ContentView
import SwiftUI
struct ContentView: View {
@ObservedObject var randomUserViewModel = RandomUserViewModel()
var body: some View {
List(randomUserViewModel.randomUsers){ aRandomUser in
RandomUserRowView(aRandomUser)
}
// List(0...100, id:\.self){ index in
// RandomUserRowView()
// }
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#2. UI-> RandomUserRowView
import Foundation
import SwiftUI
struct RandomUserRowView: View {
var randomUser : RandomUser
init(_ randomUser : RandomUser){
self.randomUser = randomUser
}
var body: some View {
HStack {
ProfileImageView(imageUrl: randomUser.profileImgUrl)
Text("\(randomUser.description)")
.fontWeight(.heavy)
.font(.title2)
.lineLimit(2)
.minimumScaleFactor(0.5)
}.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 50, alignment: .leading)
.padding(.vertical)
}
}
struct RandomUserRowView_Previews: PreviewProvider {
static var previews: some View {
RandomUserRowView(RandomUser.getDummy())
}
}
#3. UI-> ProfileImageView
import Foundation
import SwiftUI
import URLImage
struct ProfileImageView: View {
var imageUrl: URL
var body: some View {
URLImage(imageUrl, content: { image in
image
.resizable()
.aspectRatio(contentMode: .fit)
})
.frame(width: 50, height: 50)
.clipShape(Circle()) // 원형에 넣기
.overlay(Circle().stroke(Color.orange, lineWidth: 3))
}
}
struct ProfileImageView_Previews: PreviewProvider {
static var previews: some View {
let url = URL(string: "https://randomuser.me/api/portraits/women/85.jpg")
ProfileImageView(imageUrl: url!)
}
}
#4. Data-> RandomUser+ResponseData.swift
import Foundation
struct RandomUser : Codable, Identifiable, CustomStringConvertible{
var id = UUID()
var name : Name
var photo : Photo
private enum CodingKeys: String, CodingKey{
case name = "name"
case photo = "picture"
}
static func getDummy() -> Self{
print(#fileID, #function, #line, "")
return RandomUser(name: Name.getDummy(), photo: Photo.getDummy())
}
var profileImgUrl : URL {
get{
URL(string: photo.medium)!
}
}
var description : String{
return name.description
}
}
struct Name: Codable,CustomStringConvertible{
var title: String
var first: String
var last: String
var description : String{
return "[\(title)] \(first), \(last)"
}
static func getDummy() -> Self{
print(#fileID, #function, #line, "")
return Name(title: "유튜버", first: "정대리", last: "개발하는")
}
}
struct Photo: Codable{
var large: String
var medium : String
var thumbnail : String
static func getDummy() -> Self{
print(#fileID, #function, #line, "")
return Photo(large: "https://randomuser.me/api/portraits/women/33.jpg", medium: "https://randomuser.me/api/portraits/women/33.jpg", thumbnail: "https://randomuser.me/api/portraits/women/33.jpg")
}
}
struct Info: Codable {
var seed : String
var resultsCount : Int
var page : Int
var version : String
private enum CodingKeys: String, CodingKey{
case seed = "seed"
case resultsCount = "results"
case page = "page"
case version = "version"
}
}
struct RandomUserResponse: Codable, CustomStringConvertible{
var results : [RandomUser]
var info: Info
private enum CodingKeys: String, CodingKey{
case results, info
}
var description: String{
return "results.count: \(results.count) / info: \(info.seed)"
}
}
#5. Data-> RandomUserViewModel
import Foundation
import Combine
import Alamofire
class RandomUserViewModel: ObservableObject{
//Mark: Properties
var subscription = Set<AnyCancellable>()
@Published var randomUsers = [RandomUser]()
var baseUrl = "https://randomuser.me/api/?results=10"
init(){
print(#fileID, #function, #line, "")
fetchRandomUsers()
}
func fetchRandomUsers(){
print(#fileID, #function, #line, "")
AF.request(baseUrl)
.publishDecodable(type: RandomUserResponse.self)
.compactMap{$0.value}
.map{$0.results}
.sink(receiveCompletion: {completion in
print("데이터스트림 완료")
}, receiveValue: { (receivedValue: [RandomUser] ) in
print("받은 값 : \(receivedValue)")
self.randomUsers = receivedValue
}).store(in: &subscription)
}
}
출처: https://youtu.be/aMes-DVVJg4
'GET & POST' 카테고리의 다른 글
Post API 호출예 (0) 2022.07.12 SwiftUI GET & POST request, 예제 1 (0) 2022.06.29