ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.