RunWay (8) SwiftData 연동
SwiftData 사용하기 러닝 기록을 저장하기 위해 CoreData와 SwiftData를 고민하다가 SwiftData를 선택했다. 가장 큰 이유는 SwiftData가 CoreData를 개선한 방식이기도 하지만, 모델링이 편하다는 장점도 있다. @Model만 붙여주면 되기 때문이다. 물론 Xcode에서 CoreData → SwiftData 마이그...
SwiftData 사용하기 러닝 기록을 저장하기 위해 CoreData와 SwiftData를 고민하다가 SwiftData를 선택했다. 가장 큰 이유는 SwiftData가 CoreData를 개선한 방식이기도 하지만, 모델링이 편하다는 장점도 있다. @Model만 붙여주면 되기 때문이다. 물론 Xcode에서 CoreData → SwiftData 마이그...
ModeAView 설정하기 ModeA는 가칭이지만 기능적으로는 목표 기반 러닝 모드다. 유저가 목표 페이스, 허용 오차(paceDeviation), 목표 거리를 설정하고 러닝을 시작하면 GPWS가 실시간으로 페이스를 감시한다. 이 값들이 있어야 SINK RATE, OVERSPEED, MINIMUMS 로직이 동작하기 때문에 GPWS 구현 전에 먼저 ...
PFD 실시간 데이터 표시 PFDView가 요구하는 데이터 Mock UI 기준으로 PFDView에 하드코딩된 값들을 추려보면 아래와 같다. 현재 페이스 (5'32"), 평균 페이스 누적 거리 (8.42 km) 고도 (0.42 km) 경과 시간 (48:12) 방향 (N 180°) 이 중 ADI의 경사도(-1.2%)와 수직속...
블로그를 오래 운영하다 보면 이미지가 깨지기 시작한다. 처음에 깃블로그 이전에 만들었던 velog에서 가져온 이미지, esdrop 이미지, 그리고 GitHub issue에 드래그해서 올렸던 이미지 등.. 이 이미지들은 호스팅하는 쪽이 운영 중단하거나 사라질 가능성이 항상 존재해왔다. 오늘 하루를 통째로 써서 정리했다. python 안쓴지 오래라 자...
생각보다 빨리 끝나서 오늘 미리 좀 해보려고 한다. 아무래도 Actor쪽이다보니 빨리하는게 좋다고 판단했다. Actor의 경우 Swift Concurrency & 격리(Isolation) 핵심 개념 정리, 미니프로젝트 등등 언급을 많이 했어서 패스하도록 한다. RunningCenter Actor 기본 구조 구현 RunWay에서는 GPS,...
Swift Concurrency & 격리(Isolation) 핵심 개념 정리 Matt Massicotte의 강연을 바탕으로 정리한 Swift Concurrency 가이드. 단순한 문법 습득을 넘어, 왜 이렇게 설계되었는지를 이해하는 것을 목표로 한다. 1. 왜 Swift Concurrency인가? 관습(Convention)에서 ...
RunViewModel 만들기 현재까지 LocationService와 HealthKitService를 각각 구현했다. 하지만 View가 이 서비스들을 직접 들고 있으면 데이터 수집과 화면 표시가 한곳에 섞이게 된다. 또한 이후 위치 정보와 HealthKit 데이터를 조합해야 하는 시점이 오면 View에서 처리하기에는 책임이 커지게 된다. 그래서 R...
HealthKitService 만들기 이전글에서 구현한 CoreLocation만큼 중요한 기능이다. 여기도 나중에 참고하면 좋게 하기위해 나름 자세하게 써보려 한다. 1. HealthKit 추가하기 이렇게 추가를 해준다. 2. Info.plist에 추가 이젠 수동으로 info를 관리하니 예전처럼 추가만 해주면 된다. 이전글에 있...
LocationService 만들기 러닝앱에서 빠지면 안되는 가장 중요한 요소이다. 오늘은 이걸 만들고 mockui하나 만들어서 시뮬레이터와, 실기기 테스트를 할 예정 다만 Swift6로 만들기때문에 초기에 잘 해놔야할 것 같다. 이미 알고 있는 부분이 많긴하지만, 그래도 디테일하게 하나 하나 작성을 하면서 가보려 한다. 이유는 그냥 나중에 ...
시작하게 된 이유 Swift Concurrency를 공부하면서 Actor를 제대로 써보고 싶었다. 단순히 @MainActor를 클래스에 붙이는 것 말고, 별도의 격리 영역을 만들어서 데이터를 처리하는 구조를 직접 만들어보고 싶었다. 미니 프로젝트 목표 Timer로 임의의 데이터를 생성해서 Actor에 흘려보내고, 그 결과를 ViewModel...