sladuf
200
sladuf
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • 📚 Programming (32)
      • Swift (13)
      • JAVA (2)
      • Python (6)
      • SQL (6)
      • Web (5)
    • 📱 iOS (25)
      • Base (7)
      • SwiftUI (9)
      • UIKit (7)
      • 인강 & 책 (2)
    • 🔗 Algorithm (20)
      • Python (12)
      • Swift (3)
      • Tip (5)
    • 🗂 ETC (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Swift
  • 스위프트

최근 댓글

최근 글

티스토리

글쓰기 설정
hELLO · Designed By 정상우.
sladuf

200

[Swift] json value type이 달라지는 response에 대응하여 API Responder만들기
📱 iOS/Base

[Swift] json value type이 달라지는 response에 대응하여 API Responder만들기

2023. 2. 12. 19:31

 

 


요즘 Set이 된 나의 개발 스타일,, 중복을 다 제거해버리자

 

 

 

지금 하고 있는 프로젝트에서 API를 다음과 같이 명세했습니다

 

그래서 어떤 api를 호출하냐에 따라 form의 변화는 없지만 data의 값은 항상 달라진다

 

일단 json을 파싱할 struct를 만들어주어야 하는데, 

모든 api마다 struct를 만들게 되면

이런식으로 계속해서 DTO struct의 중복이 일어나게 된다

중복이 너무 싫은 나..

 

제네릭으로 묶자!

struct ResponseDTO<CommonDataDTO: Decodable> : Decodable {
    var success : Bool
    var data : CommonDataDTO
    var error : ErrorDTO?
    
}

struct ErrorDTO : Decodable, Error {
    let code : Int
    let message: String
}

자, 이제 json을 가져올 struct는 완성이 되었습니다

근데 항상 같은 struct로 json을 파싱한다면 그 로직도 똑같지 않을까 ?

 

그렇다면 Common Responder를 만들어두자

public struct JsonParser<CommonDataDTO: Decodable> {
    
    public init(){}
    
    //Moya를 사용하여 request함
    public static func parseResponse(_ result: Result<Response, MoyaError>) -> Result<Any?, Error> {
        
        switch result {
        case .success(let response):
            do {
                
                let commonResponse = try JSONDecoder().decode(ResponseDTO<CommonDataDTO>.self, from: response.data)
                if let error = commonResponse.error {
                    return .failure(error)
                }
                return .success(commonResponse.data)
            } catch {
                return .failure(error)
            }
        case .failure(let error):
            return .failure(error)
        }
        
    }
}

 

보시다시피 메소드를 사용할 때 CommonDataDTO의 type을 결정하여 넣어줄 수 있습니다 :)

provider.request(.mainInfo) { [weak self] event in
    let result = APIResponder<MainData>.parseResponse(event)
    switch result {
    case let .success(response):
       print(response)
    case let .failure(error):
        print(error)
    }
}

 

요청하는 부분까지 parseResponse에 담아두고 그 값을 구독하고 싶은데,

모듈화를 적용한 상태라 아직 MoyaProvider를 제네릭하게 사용할 수 있는 좋은 방법을 찾고 있답니다..😅

만약 provider가 한개라면 request하는 부분까지 메소드에 담을 수 있어요!

 

좋은 아이디어 있으시면 공유해주세요 :)

 

 

 

 

 

저작자표시 (새창열림)

'📱 iOS > Base' 카테고리의 다른 글

[Swift] 재사용 가능한 NetworkManager만들기 (feat. Generic)  (3) 2023.05.05
[Swift] 서버에 iOS 이미지 보낼 때 용량 이슈 & 해결  (0) 2023.03.23
[RxSwift] 개념잡기 (Subscribe, Observable, Subject)  (0) 2023.02.04
[Swift] Custom Calendar 달의 마지막 날 구하기  (0) 2023.01.16
[Stanford iOS] 아키텍처 & MVC  (0) 2022.05.05
    '📱 iOS/Base' 카테고리의 다른 글
    • [Swift] 재사용 가능한 NetworkManager만들기 (feat. Generic)
    • [Swift] 서버에 iOS 이미지 보낼 때 용량 이슈 & 해결
    • [RxSwift] 개념잡기 (Subscribe, Observable, Subject)
    • [Swift] Custom Calendar 달의 마지막 날 구하기
    sladuf
    sladuf

    티스토리툴바