전체 글
[SwiftUI] AppleMusic(MusicKit) 사용법(MVVM 곁들인)
결과물 -MusicKit 설정 1. 사용하기 위해서 우선 Apple Developer 계정이 등록된 상태로!! Certificates, Identifiers & Profiles TARGETS -> Info(Custom iOS Target Properties)에서 Privacy - Media Library Usage Description을 등록해주자 이 두 과정이 끝나면 MusicKit 맛대로 사용하면 된다! -MusicKit 사용법 1. 필요한 기능을 하기위한 모델을 만들자 import Foundation struct MusicModel: Codable, Hashable, Identifiable { var id: String var album: String? var title: String var ar..
Flutter "Freezed"를 이용한 Model 관리하기
https://pub.dev The official repository for Dart and Flutter packages. Pub is the package manager for the Dart programming language, containing reusable libraries & packages for Flutter and general Dart programs. pub.dev -Motivation Freezed- Dart는 훌륭하지만 "모델"을 정의하는것은 지루하다.라고 하며 아래 기능들을 직접적으로 수행해야 한다고 한다. define a constructor + the properties override toString, operator ==, hashCode implement a co..
Firebase 실시간 데이터베이스에 대한 클라이언트 액세스 만료 문제
- 개발 도중 메일 확인중 firebase에 메일이 한통 와 있었다. 엑세스 접근이 만료라 사용불가라는 내용이었다. 문제 확인 테스트 모드에서 개발을 진행하였기 때문. 처음 firebase 세팅시에 보안 규칙을 설정하지 않았다. 정말 간단하게 read,write를 현재 기준으로 부터 앞자리 1 -> 2로 바꿔주면 시간이 늘어나 문제 해결된다.
[iOS/SwiftUI] V,HStack 과 LazyVStack 차이
SwiftUI의 LazyVStack은 화면에 보이지 않는 컨텐츠를 로드하지 않고 효율적으로 스크롤 가능한 세로 뷰를 구현하는 데 사용된다. VStack과 비슷하지만, LazyVStack은 필요한 경우에만 뷰를 생성하기 때문에 매우 큰 데이터 세트를 처리하는 데 유용하다. 즉, LazyVStack은 매우 큰 데이터 세트가있는 경우 성능 문제를 해결하기 위해 사용된다. 이 컴포넌트는 데이터가 화면에 보이는 경우에만 필요한 뷰를 생성하기 때문에, 화면에 보이지 않는 데이터는 로드되지 않아 성능이 향상된다. 또한, 스크롤 할 때마다 새로운 셀을 생성하기 때문에 메모리를 효율적으로 사용할 수 있다. 1...10000개의 데이터를 불러올때의 View를 그리는 시간 차이 예시이다. 왼쪽 VStack은 10000개의 ..
[SwiftUI] 키보드 focus, 클릭시 사라지기, View가림현상 간단 해결방법
부모 뷰에서 자식 뷰로 넘어갈때 TextField에 focus가 유지되는 기능이다. iOS 15 부터는 UIKit 필요 없이 @FocusState를 사용해 TextField의 클릭여부를 관리 할 수 있다. FocuseState는 PropertyWrapper로 @State를 통해 상태 변수를 만들어 사용했던 것처럼 사용할 수 있다. 하지만 TextField와 SecureField에 달 수 있는 .focused 메소드에서 사용 가능하다. struct SearchView: View { enum Field: Hashable { case searchBar } @Environment(\.dismiss) var dismiss var body: some View { NavigationStack { VStack { se..
[SwiftUI] 이미지캐싱 Kingfisher SDWebImage 차이 & 사용법
Kingfisher는 Swift로 작성된 인기있는 iOS용 이미지 다운로드 및 캐싱 프레임워크이다. 원격 URL에서 이미지를 로드하고 표시하기 위한 사용하기 쉬운 API를 제공한다. kingfisher는 이미지 로딩 성능을 개선할 수 있는 고급기능도 제공한다. 캐싱이란? 캐싱(Caching)은 데이터나 정보를 미리 저장해두는 것이다. 이를 통해 이후에 해당 데이터나 정보에 대한 요청이 있을때 빠르게 제공할 수 있다. 보통 캐싱은 매우 빠른 속도로 데이터를 처리하는 메모리나 디스크에 저장된다. 이렇게 저장된 데이터는 나중에 같은 데이터에 대한 요청이 있을 때, 캐시에서 직접 가져와서 처리함으로써 원래 데이터를 가져오는 것보다 훨씬 빠르게 처리가 가능하다. Ex) Firebase에 등록되어 있는 imageU..
[SwiftUI] UserDefaults & @AppStorage를 활용한 예제
@State값이 변경될 때 자동으로 View를 그려주는 것이 SwiftUI의 최대 장점이다. UserDefaults 객체는 어플리케이션 설정을 저장할 때 사용된다. UserDefaults를 사용하면 전처리를 사용해야한다는 번거로움이 있다. Userdefaults 적은 양(512KB)의 데이터를 저장하는 데 적합한 형식 앱이 런칭될 때 함께 로드됨 유저가 언제 마지막으로 접속했는지, 마지막으로 본 글이 무엇인지 등을 저장하기에 적합함 String 으로 저장되므로 꺼내 쓸 때 형식을 지정해줄 필요가 있음 Struct 를 JSON으로 인코딩하여 사용할 수 있으며, 이때 저장될 Class 에는 Codable 프로토콜을 선언해 주어야 함 iOS 14.0 이상 사용가능한 @AppStorage 프로퍼티를 사용하면 화..
[SwiftUI] Firebase ViewModel 'Combine' snapShot Listener(파이어베이스 스냅샷 리스너)
Combine 사용전인 전 글 '[SwiftUI] Firebase Storage 다중이미지 upload & retrieve, 별점 리뷰 글 posting' 을 보면 비교를 쉽게 확인할 수 있다. 먼저 등록할 가게정보의 Store 구조체를 만들어준다. import Foundation import SwiftUI import UIKit import FirebaseFirestore import FirebaseFirestoreSwift struct Store: Codable, Hashable, Identifiable { @DocumentID var id: String? var storeName: String var storeAddress: String var coordinate: GeoPoint var store..
[SwiftUI] Firebase Storage 다중이미지 upload & retrieve, 별점 리뷰 글 posting
Firestore database는 1.5mb 이하의 데이터만 저장이 가능하기에 이미지를 업로드 하지 않고 database에는 이미지의 uuid를 배열로 등록하여 저장하고 일반 하드인 Storage에 업로드 해야한다. retreive시에는 Storage에 저장된 UUID로 생성한 review.id, image.id의 url을 불러와 database에 저장한다. 1. 먼저 이미지 업로드 전에 Review에 들어갈 속성들을 구조체로 만든다. review(post)마다 uuid, 로그인 사용자 판별 id, 리뷰 글, 다중 이미지 처리하기위한 배열, 사용자의 닉네임, 별점(깍두기 이미지 대체) createdDate는 작성된 한국 시간별로 리뷰를 분류하기 위해 사용한다. import Foundation impor..
[SwiftUI] Property Wrapper(@ObservedObject, @StateObject, @Environment) 프로퍼티 래퍼
@ObservedObject -> Obsevable Object를 구독하며, 모델의 데이터가 변경될 시 View를 무효화하는 PropertyWrapper View가 인스턴스를 생성하면 View가 삭제되고 다시 그려질 때 인스턴스가 생성된다. ViewModel을 ObservableObject로 선언하고 ObservedObject를 사용하여 View를 새로 그릴 수 있다. 1초씩 증가하는 TimerData를 Observable로 선언해 ObservedObject로 불러와 View를 그려 준다. 여기서 ObervedObject의 특성으로 reset 버튼을 누르면 Timer Count가 초기화 0 -> 인스턴스가 유지되지 않고 초기화 X -> View를 다시 그린다. FirstView 에서 reset을 눌러도 ..