분류 전체보기
-
[포케덱스] - TCA 관련 문제: Perceptible state was accessed but is not being tracked.프로젝트/포케덱스 2025. 9. 1. 20:20
오늘은 런타임시에 발생하는 에러에 대한 내용에 대해 트러블 슈팅을 하겠다. 포케덱스에서 이런 에러가 나기 시작했다.TCA를 사용하면서 생긴 문제다. 문제 파악 이런 에러는 다음과 같은 상황에 뜬다. 1. 빌드 후 4개의 보라에러가 뜸2. 포켓몬 상세보기를 누르면 4개가 추가됨3. 나왔다 상세보기를 계속 들어갈 떄마다 3~4개씩 추가됨 생기는 상황은 이렇고 에러 메세지는 다음과 같다.Perceptible state was accessed but is not being tracked. Track changes to state by wrapping your view in a 'WithPerceptionTracking' view.This must also be done for any escaping, trail..
-
[포케덱스] - TCA 적용기프로젝트/포케덱스 2025. 8. 20. 19:52
오늘은 포케덱스 배포를 완료한 기념으로 지난 SwiftUI+MVVM 버전에서 SwiftUI+TCA로 리펙토링하게된 모든 전기를 작성해볼 것이다. TCA를 알게된 것은 작년이다.하지만 당장은 아키텍쳐적인 부분보다 기본기와 기존 앱들의 성능과 코드 컨벤션 개선을 하는게 우선순위가 더 높아보여서 보류 중이였다.그러다가https://gist.github.com/unnnyong/439555659aa04bbbf78b2fcae9de7661 swiftui_mvvm.mdGitHub Gist: instantly share code, notes, and snippets.gist.github.com 해당 글을 보게 됐는데, SwitUI+MVVM은 어울리지 않는다라는 내용의 글이다.정리하자면 이렇다. 기존 SwiftUI+MVV..
-
[포케덱스] - LazyVGrid 무한스크롤 구현하기(feat. SwiftUI + TCA)프로젝트/포케덱스 2025. 8. 19. 21:05
오늘은 TCA를 적용하게 된 김에 무한 스크롤에 대해서 포스팅을 할 것이다.무한 스크롤을 구현하기 위해서는 리스트 뷰의 셀 중 마지막 요소가 보일 때 요청하도록 하는 것이 핵심이다. 그것을 구현하기 위해서는 LazyVGrid랑 LazyVStack가 필요하다.이유는 아래에서 천천히 설명해볼 것이다. 먼저 LazyVGrid에 대해서 먼저 알아보자. LazyVStack도 동일하게 적용되는 부분이다. 이런 코드가 있다고 하자struct LazyVGridView: View { let columns = Array(repeating: GridItem(.flexible()), count: 3) var body: some View { ScrollView { LazyVGr..
-
[포케덱스] - TCA의 Action을 관리해보자(feat. @CasePathable)프로젝트/포케덱스 2025. 8. 18. 20:18
기존에 포케덱스는 MVVM 아키텍쳐로 구현되어 있었다.하지만 최근에 SwiftUI+MVVM의 사용은 그닥 효율적이지 못하다는 글을 보고 나도 생각에 잠겼다.이유는 이해를 했다. 애초에 ViewModel은 View와 데이터를 바인딩하기 위해 존재하는 것이지만 SwiftUI는 @State 등의 프로퍼티 래퍼가 있기 때문에 ViewModel이 존재할 필요가 없다. 그래서 비즈니스 로직과 사이드 이펙트를 단방향 흐름을 준수하며 어떤 아키텍쳐를 준수할 수 있을까 고민하던 중 SwiftUI와 잘 맞는다는 TCA를 이용해 리펙토링을 새로 해보기로 다짐했다. TCA사용에 대한 회고는 나중에 포스팅할 것이다. 오늘은 TCA의 내용 중 Action에 대한 내용에 대해 다뤄볼 것이다. 위의 코드를 보자 Action이라고 정..
-
[iOS] - 선언형 UI와 명령형 UIiOS/iOS 2025. 8. 7. 16:30
오늘은 제목 그대로 두개의 차이가 궁금해서 포스팅하게 됐다.사실 선언형, 명령형이라는 말을 아무렇게나 남용한 것 같은데,,, 제대로 알지 못하면서 이 말을 쓰는 건 양심에 찔려서 생각난 김에 깊숙히 파고 들어보기로 했다. 선언적 UI “무엇을 그릴지 선언한다.” 대표적인 예로 SwiftUI가 있다.SwiftUI에서는 @State, @Binding, @StateObject와 같은 프로퍼티 래퍼를 사용해 상태 변수를 선언한다. 이 상태 변수는 Button, TextField 등의 컴포넌트를 통해 변경되며, 상태가 바뀌면 그에 따라 UI가 자동으로 다시 렌더링된다. 여기서 핵심은 “어떤 컴포넌트를 쓸지”보다, “어떤 상태를 다룰지”에 중점을 둔다는 것이다. UI는 결국 상태의 함수로 볼 수 있다.우리는 상태..
-
[포케덱스] - 오픈소스 기여 관련 회고프로젝트/포케덱스 2025. 7. 14. 17:54
오늘은 오픈 소스기여 관련해서 겪었던 내용에 대해서 포스팅을 해보겠다. 사실 결론부터 말하자면 실질적인 기여가 되지는 않았다. 하지만 이런 경험은 나에게는 소중한 기회였기 때문에 계기 부터 결과까지 전반적인 회고를 남겨보려고 한다. PokéAPI 사용계기 포케덱스 프로젝트는 PokéAPI에서 제공하는 API를 사용해 포켓몬 데이터를 앱에서 사용할 수 있도록 만들어진 서비스다.PokéAPI는 포켓몬 게임과 관련된 모든 데이터를 가지고 있는 API이기 때문에 도감을 만들기 안성 맞춤인 API였다. 그 중에서 kinkofer/PokemonAPI는 PokéAPI를 Swift에서 간편하게 사용할 수 있도록 만든 wrapper 라이브러리다. 원본 데이터를 URLSession으로 직접 요청하는 작업은 이미 경험해봤기..
-
[베스트위시] - GitHub Actions 관련 트러블 슈팅프로젝트/베스트위시 2025. 7. 2. 11:13
1. Config파일 인식 불가 문제문제config 파일은 .gitignore파일에 되있기 때문에 GitHubAction에서 지정해 줄 수가 없었음해결deploy.yaml에서 config 파일을 직접 생성해서 필요 내용을 넣어주는 것으로 해결- name: Configuraion file setting run: | echo "API_KEY = ${{ secrets.CONFIG_API_KEY }}" > BestWish/Config_Release.xcconfig echo "SUPABASE_URL = ${{ secrets.CONFIG_SUPABASE_URL }}" >> BestWish/Config_Release.xcconfig echo "CLIENT_ID = ${{..
-
[베스트위시] - CoreML 관련 트러블 슈팅프로젝트/베스트위시 2025. 7. 2. 11:10
1. 포맷에러트레이닝할 데이터는 형식이 무조건 갖춰져야 가능함에러 발생 이유기존 annotation.json의 형식은 아래와 같았음{ "image": "레트로/21349.jpg", "annotations": [ "스타일:레트로", "상의:카테고리:블라우스", "상의:색상:베이지", ... ]}{ "image": "레트로/21349.jpg", "annotations": [ "스타일:레트로", "상의:카테고리:블라우스", "상의:색상:베이지", ... ]}{ "image": "레트로/21349.jpg", "annotations": [ "스타일:레트로", "상의:카테고리:블라우스", "상의:색상:베이지", ... ]}해결 방법코드..