일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- RxSwift
- authentication
- SwiftUI
- fullscreencover
- Concurrency
- environmentobjet
- stateobject
- iphone
- CS
- Animation
- ios
- gesture
- firebase
- withAnimation
- GCD
- arkit
- UIKit
- 데이터최적화
- realitykit
- Performance
- 달력
- Network
- state
- auth
- dataflow
- combine
- WWDC
- swift
- 네트워크
- ar
- Today
- Total
목록SwiftUI (28)
XLOG
이전 회사에서 혼자 AR 을 담당해서 개발을 했었는데, 바쁘다는 핑계로 제대로 정리를 한적이 없었다....그래서 시작하게 된 AR Posting1. ARKit, RealityKit 은 무엇일까?ARKitAR을 사용하려면 ARKit 을 쓰면된다고 생각하지만 100% 맞다고 할 순 없다. 실제 우리가 App 을 만들때 UI 가 있어야 하지만, ARKit 은 우리가 사용할 수 있는 UI 요소가 존재하지 않는다. ARKit 은 AR 환경을 구축하기 위해 내가 가지고 있는 하드웨어(iPhone, iPad)에 장착되어 있는 센서들을 통해 데이터를 받아와 AR 환경을 만드는데 도움을 주는 프레임워크이다.RealityKitRealityKit 공식 문서 페이지에서 말해주듯이 3D 시뮬레이션 및 렌더링 기능을 제공하는 프..
1. Observation 이란?wwdc 23 에서 발표한 observation 은 프로퍼티의 변화를 추적하는 Swift 기능으로 같은 wwdc 23 에 발표한 swift 5.9에 신기능인 매크로를 사용하여 정의한 데이터 타입을 observable 하게 바꿔주는 기능이다.2. 사용방법정의한 class 에 @observable property wrapper 를 붙여준다.import Foundationimport Observation@Observable class DataModel { var count: Int = 0}이를 View 에서 사용할 땐 @State, @Environment, @Bindable, var 를 사할 수 있다. 여기서의 기준은View의 부분일 경우 @State, 글로벌하게 변수를 사용할..
사이드 프로젝트를 진행하면서 Tree 형태의 데이터 구조를 만들어 사용했다.데이터는 SwiftData 를 사용해서 저장을 했으며 Model 은 Hashable 을 상속시켰다.그런데 데이터를 수정하고 나서 한번씩 Fatal error 가 발생했다.테스트를 더 해보긴 해야겠지만 찾아본 바로 원인은 Hashable을 충족하기 위해서 Equatable 또한 상속시켜야 한다. Hashable 이 Equatable 을 상속해야하는 이유는 HashValue 의 비교를 위해서인데, 여기서 내가 실수한 부분은 == 에 정의할 때 비교 연산을 Hash 함수에 사용한 Propertie 와 달라서 였다.예를 들면class Model { let id: UUID = UUID() let name: String let s..
1. SwiftUI 는 언제 View를 Update 하는가?우리가 SwiftUI 를 사용하며 View 를 정의할 때 @State, @StateObject 와 같은 변수를 정의하게 되면 View 는 Source of truth 를 만들어 관리를 한다. 이때 UI 를 통해 Action 을 발생시켜 Source of truth 의 값의 변화를 준다면 그 값의 변화를 View 에 알리고 View에서는 body 를 다시 compute 를 한다. body를 다시 compute 한다는 것은 body 내부에 코드를 한줄한줄 실행을 해준다는 의미이다.2. 그렇다면 어떻게 Update 를 최소화 하는가?2-1. SubView를 사용하여 View가 의존하는 변수를 최적화한다.위에서 설명을 했지만, View 가 추적하고 있는..
1. StateSingle source of truth 로 View 에서 PropertyWrapper 로 정의 한다. 그로 인해 View 와 따로 독립적으로 SwiftUI 가 데이터를 관리해 주며 생명 주기는 View 의 생명주기와 동일하다. State 값의 변화를 view에 알려주면 View 는 re-render 한다.단 해당 State 가 정의된 View 의 body 내부에 직접적으로 state 값을 활용하여 View 의 내용이 달라지는 요소가 없다면 re-render 하지 않는다.import SwiftUIstruct ParentView: View { @State var count: Int = 0 var body: some View { VStack { ..
친한 개발자와 얘기를 하다가 밀리의 서재에서 책을 클릭했을 때 나오는 Animation 얘기가 나와서 어떻게 구현했을까 고민을 하다가 SwiftUI 로 구현해봐야 겠다 생각해서 시작한 일이다. 1. 문제점기존에 Namespace 를 사용할 경우 기존 view 가 없어져야함, 하지만 위에 화면을 보게되면 기존 ScrollView는 항상 있어야 함Scroll 에 따라서 해당 View 가 가지고 있는 크기 및 위치값인 CGRect 를 Update 를 해주기 위해선 PreferenceKey 를 사용해야 하는데 PreferenceKey 의 경우 하위 View 에서 상위 View의 값을 전달할 때 사용하는 것인데, FullScreenCover 는 CellView 의 상위뷰가 아님present 할 때와 dismiss..
보통 앱 내의 데이터를 저장할 때 많이 사용하는 것이 UserDefault 와 CoreData 이다. UserDefault 의 경우 앱의 설정(라이트모드, 다크모드 등) 과 같은 간단한 데이터를 저장하는데 사용한다면, CoreData 의 경우 좀 더 복잡한 데이터를 저장하는데 사용한다고 한다.처음 Swift 를 접하고 코어데이터란게 있다 라는 얘기를 주변사람들에게 들었을 때는 DB 같은건가 하는 생각을 했었다.하지만 CoreData 는 단순히 데이터베이스라고 생각하긴 어렵다.CoreData 는 프레임워크다. 어플리케이션에서 offline으로 사용할 수 있는 영구적인 데이터를 저장, 관리를 도와주는 프레임 워크로 icloud 계정을 통해 다양한 device 에 데이터를 동기화까지 가능하게 해준다. 공식문서..
IAP 는 In-App-Purchase 의 약자이다.우선 인앱결제를 하기 위해선 개발자계정, 상품등록된 앱, 또한 그 앱의 앱내구입 상품 등록이 필요하다.앱스토어에 앱을 올리면 수익화 카테고리에 앱 내 구입 항목이 있다.클릭하면 내 앱에 인앱결제를 할 수 있는 항목 추가가 가능하다.위에 과정을 보면 알 수 있듯이 결제는 앱스토어 서버를 통해 이루어 진다.우리의 앱은 앱스토어 서버를 통해 Transaction 을 받아서 인앱 결제 로직을 처리한다.인앱결제 상품은 총 4가지가 있다.소모성 항목비소모성 항목자동 갱신 구독비갱신형 구독그럼 In App Purchase 의 테스트 환경을 만들어보자. 실제 공부하는 사람들은 개발자 계정 및 출시한 앱이 없을 수 있다. 하지만 StoreKit에서는 StoreKit C..
GCD VS Concurrency동기화의 대한 처리, 같은 데이터에 접근을 위해 GCD 의 경우 뮤텍스, 세마포어 등을 이용해야 하나, Concurrency 는 컴파일 에러를 발생시킨다.즉 안정성이 높다GCDworkItem 당 하나의 스레드를 할당,스레드는 결국 메모리에 할당, thread explosion., 메모리 오버헤드를 발생시킬 수 있다Context switching 이 발생하며, 블록된 스레드가 어떤 자원을 lock 하고 있을 때 데드락 발생ConcurrencyCPU 성능 이상의 스레드를 생성하지 않는다또한 await으로 중단됐을 때 컨텍스트 스위칭을 하는 것이 아닌 같은 스레드에서 다음 함수를 실행우선순위 역전Concurrency는 FIFO 가 아니기 때문에 우선순위가 높은 작업이 들어오게 ..
회사에서 근무를 하며 백엔드에서 날려주는 상황별 Error Code 는 매우 다양했다. 하지만 Client 측에선 다양한 Error Code 라도 유저가 할 수 있는 Action 은 그리 다양하지 않았다.그리고 회사에서 TCA 를 적용해서 프로젝트를 진행하였기 때문에 Error Handling 을 Composable 하게 구성할 수 없을까 고민을 했다. 그래서 Error Handling 을 위한 Redcuer 와 View 를 만들어 각 Feature 적용해야 겠다는 생각을 했다.우선 내가 throw 할 수 있는 Error Case 와 해당 Error 마다 할 수 있는 액션들의 정의가 필요했다.//// Created by Sooik Kim on 5/15/24.//import SwiftUI// API 통신..