Project56 [SwiftUI Project] 예외처리: StatusCode에 따라서 안내글 띄우기 이번에는 네트워크에 데이터 요청 시 Stutus Code 400, 500 에러가 발생한다면 유저에게 안내글을 보여줄 수 있도록 작업하였습니다. 실제로 종종 발생할 수 있는 429와 500 에러에 맞춰서 작업하였습니다. 안내글을 보여주는 방식은 알럿, 오버뷰, VStack 등 고민을 많이 해봤는데, 개인적으로 이번에는 VStack으로 코인 리스트 위에 나타나는 것이 좋을 듯해서 VStack을 활용하였습니다. 1. Status Code에 따라서 상태를 업데이트 해줄 수 있도록 작성합니다. import Foundation import Combine class CoinDataService { @Published var allCoins: [CoinModel] = [] @Published var status: St.. 2022. 10. 14. [SwiftUI Project] 예외처리: Json Data -> CoreData 백업하기 이번에는 서버로부터 데이터를 받지 못했을 때, StatusCode가 200이 아닐 때 사용자들에게 다른 화면을 보여줄 수 있도록 작업했습니다. 구현해야 하는 예외 처리 중에 첫번째는 "만약 인터넷은 연결되어 있는데 서버에 오류가 생겨 코인리스트를 받아오지 못했을 때" 백업된 코인리스트를 보여주는 것입니다. 실제로 CoinGecko Status 사이트에서 상태 기록을 보면 종종 에러가 발생하는 것을 볼 수 있습니다. (빨간 블록이 오류가 발생한 날입니다.) 최근에도 개발 도중에 이틀 연속 서버 500 장애가 발생해 당혹스러웠는데요. 만약 이렇게 불안정한 서버로 서비스했을 때 예외 처리를 제대로 하지 못한다면 사용자의 신뢰가 하락하게 되겠지요. 사용자의 이탈이 발생할 수 있기 때문에 예외 처리는 무척이나 중.. 2022. 10. 14. [SwiftUI Project] Skeleton Placeholder & Blink Animation 만들기 화면이 로딩 중일 때, 네트워크가 연결되지 않았을 때 나타나게 될 플레이스 홀더 입니다. 사라졌다 나타나는 Blink animation도 추가하였습니다. 작성은 생각보다 간편합니다. struct CoinPlaceholderView: View { let coin: CoinModel @State private var opacity: Double = 1 var body: some View { HStack(spacing: 0) { leftColumn Spacer() rightColmn } .padding() .contentShape(Rectangle()) .redacted(reason: .placeholder) // 스켈레톤 플레이스 홀더 .opacity(opacity) // 여기서부터 Blink Animati.. 2022. 10. 4. [SwiftUI Project] 당겨서 새로고침 Pull to Refresh 이번에는 당겨서 새로고침을 만들었습니다. 만들어야 하는 기능의 목표에 부합하는 자료를 찾기 힘들어서 생각보다 시간을 꽤 소요했던 작업이었습니다. 목표했던 기능은 다음과 같습니다. 당기면 ProgressView가 보이며 네트워크 다운로드 작업이 호출됩니다. Coingecko의 OpenAPI의 분당 요청 제한은 10~50회 이므로 유저의 무분별한 새로고침을 방지해야 했습니다. 트위터, 유튜브의 새로고침 ProgressView가 보여지는 시간은 너무 빠르지도 느리지도 않는 0.5초 정도 입니다. 이와 같은 사용자 경험을 만들고 싶었습니다. 구현한 기능은 다음과 같습니다. 당기면 네트워크 요청이 실행됩니다. @State var ifRefeshing = false 일 때만 네트워크 작업이 진행됩니다. 네트워크 작.. 2022. 10. 3. [SwiftUI Project] HStack 빈 공간이 터치 안되는 문제 해결 HStack으로 사진과 같은 row를 만들었을 때 양 끝의 컨텐츠만 터치되고 가운데는 터치가 안되는 경우가 생깁니다. 백그라운드 색을 지정해주면서 해결할 수도 있지만, 만약 색을 설정할 수 없다면 다음과 같이 작성할 수 있습니다. .contentShape(Rectangle()) HStack(spacing: 0) { leftColumn Spacer() rightColmn } .padding() .contentShape(Rectangle()) 참고 블로그: SwiftUI touch영역 풀로 잡기 HStack 영역을 터치했을 때 액션을 구현하기 위해 HStack 안에 Image랑 Text를 넣고 HStack자체에 onTapGesture를 넣어주었다. VStack { Image(systemName: "perso.. 2022. 10. 2. [SwiftUI Project] LazyVStack 하이라이트 색 설정하기 List에서는 row를 터치했을 때 자동으로 하이라이트됩니다. 하지만 LazyVStack으로 리스트를 작성했을 때는 하이라이트가 적용되지 않습니다. Navigation Link의 리스트를 LazyVStack으로 생성했을 때 버튼 스타일을 지정해주면 하이라이트를 만들 수가 있습니다. 아래는 이번에 적용하며 참고한 글에서 가져온 코드입니다. import SwiftUI struct ContentView: View { private var names = ["Andy", "Steve", "Kevin", "David"] var body: some View { NavigationView { ScrollView { LazyVStack(alignment: .leading) { ForEach(names.sorted(), .. 2022. 10. 2. 이전 1 ··· 3 4 5 6 7 8 9 10 다음