요즘 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 |