Swift
5 posts
Swift - Firebase 사용하기 (1)

Firebase Authentication Firebase 사이트에서 프로젝트를 만들고, 해당 프로젝트에서 iOS 앱을 만들고 GoogleService-Info.plist 파일을 추가 그리고 Firestore configure 코드(초기화 코드)까지 추가한 상태이다. 서버 백엔드를 따로 구축한다고 해도, Firebase Authentication은 따로 쓰는 것도 괜찮다. 왜냐하면 Firebase Authentication은 따로 만드는 것보다 더 간편하고 효율적이기 때문이다. Firebase auth 에서 볼 수 있듯이 인증 한도도 일일 활성사용자량 3000명 정도로, 초기 앱에 사용하기에는 괜찮은 편이다. 사용자의 인증 상태를 관리하는 AuthViewModel 코드를 살펴보자. listenToAuthState 라는 함수를 호출 시 addStateDidChangeListener 를 통해 파이어베이스 서버로부터 인증 상태를 계속 관리할 수 있다. 사용자의 인증 상태가 변경될 때마다…

Dictionary - init(grouping:by:)

init(grouping:by:) func groupMenuByCategory(_ menu: [MenuItem]) -> [MenuSection] { if menu.isEmpty { return [] } return Dictionary(grouping: menu, by: { $0.category }) .map { key, value in MenuSection(category: key, items: value) } .sorted { $0.category > $1.category } } 이 함수는 MenuItem 배열을 받아서 카테고리별로 그룹화하고, 각 그룹을 MenuSection 배열로 변환합니다. 각 단계는 다음과 같습니다: 빈 배열 검사: if menu.isEmpty { return [] } 메뉴가 비어 있는 경우, 빈 배열을 반환합니다. 그룹화: Dictionary(grouping: menu, by: { $0.category }) 메뉴 항목을 category 기준으로 그룹화합니…

Youtube API, AVFoundation, SharePlay 사용

개요 지난 AVFoundation-시작하기 포스트에 이어, 직접 앱을 개발해보기로 했다. 내가 개발하기로 한 앱의 초기 요구사항은 다음과 같다. 앱 초기 디자인은 Youtube Music App 을 클론 미디어 콘텐츠는 Youtube Search API 를 사용 AVFoundation, AVKit 등을 사용하여 미디어 플레이어 앱 개발하기 [추가] WWDC 2023에 공개된 Share Play의 기능 추가해보기 문제 해결 과정 Draggable Sheet View 구현 과정 How to create Draggable Sheet View? Youtube Music App 의 경우, Draggable Sheet View 가 존재한다. 그래서 처음에는 일반적인 sheet 모디파이어로는 구현할 수 없을 것이라 생각하고 DragGesture 를 추가하는 쪽으로 생각했다. 그러나 더욱 간단한 방법으로 시도해보았다. presentationDetants 값에서 sheet view의 최소 높이와 …

MapKit - 현재위치를 사용한 경로 탐색 앱 만들기

MapKit 을 사용한 예제 앱 개발 이번엔 최신 코드인 @Observable 매크로를 사용하여 viewModel 을 사용하였습니다. @Observable는 @Published 를 따로 쓰지 않아도 상태 추적이 가능하도록 해주는 매크로입니다. MapViewModel 생성 @Observable 를 사용한 ViewModel 은 View에서 @StateObject가 아닌, @State로 불러올 수 있습니다. 만약 하위 뷰에서 해당 viewModel 을 사용하고자 한다면? 바인딩도 필요없고, environmentObject도 사용하지 않습니다. ContentView 에서 viewModel 을 완전히 소유하고 있기 때문에, 그냥 변수를 전달하면 됩니다. Search Bar 그리고 이제 Navigation Title 과 검색바(searchable)를 추가하였습니다. 그리고 mapStyle 을 사용하기 위해서, viewModel 에 MapStyle 타입의 프로퍼티를 추가하고, mapStyle …

async, await 를 사용하면서 겪은 UI thread(Main Thread) 관리 문제

async, await? 비동기 프로그래밍을 쉽게 구현하기 위해서 등장한 async, await. 이것을 사용하면서 아래와 같은 런타임 에러가 발생했다. async, await를 사용하는 코드는 메인 스레드가 아닌 메인 스레드에서 동작하기 때문에, 만약 UI update 와 같은 코드에 async, await 사용해야 할 때에는 스레드 관리를 따로 해줘야한다. UI 갱신은 메인 스레드에서 동작해야 하기 때문이다! 이것을 해결하는 방법은 아주 간단하다. UI update 를 담당하는 부분 (예를들어, button 의 action 부분)에 @MainActor 매크로를 추가하면 된다. 결론 UI를 변경할 수 있는 코드가 포함된 async 메서드를 await으로 실행하게되면 해당 메서드는 MainActor를 붙여줘야한다! async, await? 결론