오랜만에 새벽에 잠이 깨서
버릇처럼 날씨의 i 를 켜보았습니다!
그런데..왜 또 무한로딩 현상이...
업데이트 하고나서 이런적이 없었는데...
서버에서 데이터를 받아오는 앱은 참 변수가 많은 걸 이번에 많이 느낍니다!
잠도 안오기도 하고 원인을 알아보기 위해 Xcode를 켜고, 로그를 보았습니다.
놀랍게도 두 가지 문제점이 있었습니다..
첫번째로 주간 날씨 쿼리를 보낼때 데이터의 발표 기준 시간이 0600시인데, 0600시가 지나면 오늘 시간을, 지나지 않았으면 어제 시간을 기준으로 주간 날씨를 보내게 되는데, 오른쪽 코드처럼 >인 경우 0600시에 어제 시간을 요청하게 되면서 오류가 나는 것이었습니다.
이건 새벽 6시에 안 일어났으면 무심코 지나쳤을 에러인데, 에러 해결하고 자라는 하늘의 뜻이 아닌가싶네요ㅎㅎ
두번째는 로그를 확인해보니 DustModel쪽 JSON 파싱이 잘 되지 않아 오류가 나서, 로딩이 되지 않았습니다.
지금까지 한번도 그랬던 적이 없는데..? 이상하게 생각하며 사파리 브라우저에 API를 직접 요청해보았습니다.
API요청은 잘 되는데..? 하고 보는데
자세히 보니 "gyeongbuk"의 값이 null로 들어오는걸 확인할 수 있었습니다.
기존 DustEntity에서는 String으로 되어 있어서 null값이 들어올 경우 타입이 달라 JSON파싱이 되지 않는 문제였습니다.
그래서 모조리 String?값으로 바꿔주고,
model 생성시에 혹시나 정보가 안들어오면 화면에 "서버정보없음"을 표시하도록 만들었습니다.
그러고 다시 빌드를 해보니, 드디어! 로딩이 잘 됩니다!
그리고 혹시 로딩이 길어질때를 대비해 통신 재시도 코드와 멘트를 추가했는데요
extension에 통신 재시도 코드와 CustomURLSession을 만드는 코드를 추가했습니다.
기존에 많이 사용하는 URLSession.shared는 기본적인 재시도 시간이 1분인데요,
이렇게 URLSessionConfigufation을 만들고,
.timeoutIntervalForRequest를 설정해주면, 설정한 시간 후에 재시도를 하게 됩니다.
저는 7초로 설정했어요.
그리고 혹시 로딩이 5초 이상으로 길어질때는 서버에 재시도한다는 멘트를 추가했어요!
loadingTimer변수를 옵셔널로 만들고, 5초가 지나면, 기존 로딩멘트 아래에 서버에 재시도한다는 멘트를 띄워줍니다.
그리고 가끔씩 기상청 서버 자체에서 요청이 응답 안되서 무한로딩되는 경우가 있었는데요 (기상청 분들 서버 관리 잘 부탁드려요...!)
그럴때는 아예 앱을 종료하고, 나중에 재시도하라는 Alert창을 추가했어요!
timer를 만들고, 15초 동안 로딩이 지속되면 Alert창과 함께 종료버튼이 뜹니다.
그리고 혹시 15초 이전에 로딩이 완료되었을때는
Lottie AnimationView의 completionHandler를 활용해 타이머를 해제해서 실행되지 않도록 합니다.
로딩이 끝나면 꼭! 타이머를 해제해주셔야 메모리 낭비를 줄이실 수 있어요! 빼먹지 말고 추가해주세요:)
그렇게 하면 5초 뒤에 서버 재요청 멘트가 뜨고, 혹시 15초가 넘어가게 되면 Alert창과 함께 앱을 종료시킬 수 있습니다!
.destructive 로 설정하면 빨간 글씨인데 좀 부정적인 이미지라 일단 파란 버튼으로 만들었어요ㅎㅎ
만들고 보니 마음에 드네요:)
이렇게 코드를 정리하고 재요청 로직을 추가하니 로딩속도도 이전보다 확실히 더 빨라진게 체감이 되네요!
기존 날씨의 i 사용자분들은 이번 업데이트를 꼭 하시는걸 추천드려요!
앞으로도 계속해서 더 좋은 앱으로 업데이트 하겠습니다:)
아직 앱을 다운로드받지 않으신 분들은? 앱스토어에서 다운받아주세요!
https://bit.ly/AppStore_WeatherI
'UIKit Project' 카테고리의 다른 글
[LilsMusic] MusicKit을 활용한 음악 앱 출시 회고 (Post Mortem) (0) | 2024.03.26 |
---|---|
[날씨의 i] 날씨의 i 1.0 앱스토어 출시! (날씨 알림앱, 아이폰 날씨앱, 기상청 날씨앱) (0) | 2023.08.11 |
[날씨앱] 서버 API를 받아오는 동안 로딩 화면 구현 (Lottie) (0) | 2023.06.29 |