결론만 아시려면 가장 아래의 해결을 보시면 됩니다.
문제상황
do {
let result = try JSONDecoder().decode(UserProfile.self, from: data)
print(result)
} catch {
print(error.localizedDescription)
completion(.failure(error))
}
REST API 통신으로 data를 받고 UserProfile이라는 모델로 decode 하여 인스턴스를 생성하고 있는 상황이었다. 그런데 이상하게도 자꾸 catch로 빠지는 일이 발생했다.
시도
1. 방금 전만 해도 되는 상황이었고 UserProfile을 세부조정하다가 발생한 일이라 원래의 모델을 원상태로 복구하여 시도했다. -> 실패
2. 이에 API 문서에 있는 스키마를 찾아 모델을 새로 만들고 다시 시도했다. -> 실패
3. 들어오는 데이터를 JSONSerialization.jsonObject()를 이용하여 해독하려고 했다. -> 실패
이 시점에서 들어오는 데이터가 JSON이 아닌 무언가라는 사실을 알아냈다. 디버거를 활용해서 알아봤다.
해결
Xcode에서는 po라는 명령어를 통해서 디버깅을 할 수가 있다. Data 타입은 바이너리 형식이기 때문에 사람이 읽을 수가 없다. 서버에서 통신이 들어오는데 JSON이 아니라면 올 타입은 무엇일까? 대부분의 경우에는 String이라는 생각을 했고 이를 이용하여 명령어를 찾아봤다.
아래의 명령어를 통해 data를 String으로 encode 할 수 있다. (보통은 .utf8로 할거 같다.)
po String(data: 서버가 준 데이터, encoding: .utf8)
내 경우는 아래의 결과가 나왔다.
분명 로그인해서 테스트하는 계정이 등록한 사용자가 아니긴 했는데 되다가 갑자기 안 되는게 왜 그런지는 잘 모르겠다.
계정을 등록하니 바로 된다. 깃헙에서 할때는 이 문제를 생각하지 못 했는데 스포티파이는 25개의 계정 제한이 존재한다. 만약 이 이상으로 확장하려면 따로 request를 달라고 하던데 아마추어 서비스는 안 해주는거 같다.
'Swift > etc' 카테고리의 다른 글
[RxSwift] debounce 그리고 throttle (덤으로 distinctUntilChanged) (0) | 2023.03.19 |
---|---|
[Swift] 함수의 매개변수(Parameter) 레이블 (0) | 2023.03.18 |
[UIKit] init(frame:)과 init(coder:)은 어떤 차이가 있는가? (0) | 2023.03.16 |
[Swift] Type of expression is ambiguous... 에러 (0) | 2023.03.15 |
[Swift] self와 Self의 차이점 (0) | 2023.03.11 |