요약Reactor는 View로부터 Action을 입력받아 Mutation을 생성하고, reduce를 통해 State를 계산하여 View에 제공하는 역할을 한다.즉, Reactor는 단방향 데이터 흐름(Action -> Mutation -> State)을 강제하는 ViewModel이다.Reactor의 책임Reactor는 다음을 책임집니다.입력(Action)을 정의한다.View가 발생시키는 사용자 입력을 Action으로 모델링 합니다.상태 변경 단위(Mutation)를 정의한다.State를 변경하는 "이유/사건"을 Mutation으로 표현합니다.상태(State)를 정의한다.View가 그려야 하는 UI 상태의 단일 진실원천 (SSOT)비동기 작업을 수행한다.네트워크/DB 등 side effect가 존재하는 작..
ReactorKit 개념ReactorKit이란?ReactorKit은 Flux 아키텍처의 단방향 데이터 흐름과 Reactive Programming(RxSwift)의 비동기 스트림 처리를 결합한 iOS 아키텍처 프레임워크 입니다. ReactorKit은 위에서 서술한 것처럼 Reactive Programming의 개념을 채용했기 때문에 RxSwift와 함께 사용됩니다. 따라서, ReactorKit을 사용하려면 RxSwift에 대한 이해가 전제조건 입니다. ReactorKit의 핵심 개념은 Reactor 입니다. Reactor는 Rx의 개념인 Observable과 함께 사용되며 비동기적으로 데이터를 처리하고, UI와의 상호작용을 쉽게 관리할 수 있도록 합니다. 이는 MVVM의 뷰 모델(View Model) 의..
ObservableObserver가 구독하는 대상Observable이 배출하는 하나 또는 연속된 항목을 Observer가 반응→ 이러한 패턴 덕분에 동시성 연산이 가능Observable이 객체를 배출할 때까지 기다릴 필요 없이, 배출 시점을 관찰하는 관찰자를 두고 관찰자를 통해 배출 알림을 받으면 되기 때문Observable을 생성하는 방법 (create, just, of, from)CreateCreate 연산자를 사용하면 직접 Observable을 만들 수 있습니다. 이 연산자에는 Observser를 매개변수로 받는 클로저를 전달해야 합니다.클로저 안에서는 실제 Observable처럼 동작하도록, observer의 onNext, onCompleted, onError 메서드를 적절히 호출해야 합니다.올바..
RxSwift는?비동기로 발생한 데이터를 Completion handler가 아닌 return 값으로 전달해주는 클래스Observable 생성Observable.create() { observer in observer.onNext("Hello") observer.onCompleted() return Disposables.create()}Observable 이 방출하는 데이터 타입을 가지는 객체를 생성후 .create() 메서드를 통해 Observer를 등록합니다.Observable의 생명주기create() 를 통해 생성subscribe() 를 통해 사용onNext() 를 통해 데이터 전송onCompleted() or onError() 를 통해 종료disposed() : 작업 취소Obser..
ReactiveX란?MS 사에서 만든 observable streams 기반의 비동기 프로그래밍 APIreactivex.io 에서는 ReactiveX를 다음과 같이 설명합니다.ReactiveX는 옵저버 패턴 , 이터레이터 패턴 그리고 함수형 프로그래밍 의 장점(best ideas)들을 결합한 것입니다.It extends the observer pattern to support sequences of data and/or events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synch..
기존 구조에서는 CharacterListViewController에서 supabaseMager.fetchCharacters()를 통해 캐릭터 정보를 받아오고, SwiftUI 셀에서 직접 이미지 요청을 수행하였습니다.// CharacterListViewControllerprivate func fetchCharacters() { Task { do { let fetchedCharacters: [Character] = try await supabaseManager.fetchCharacter() characters = fetchedCharacters updateSnapshot() } catch { NSLo..
오늘은 제가 iOS 앱의 라이프 사이클 관리에 대해 공부하기 위해 공식 문서를 참고하면서 정리한 부분을 포스팅하려고 합니다! 앱의 현재 상태란?앱의 현재 상태에 따라 앱이 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업을 결정예를 들어, 포그라운드 앱은 사용자의 주의를 끌기 때문에 CPU를 비롯한 시스템 리소스보다 우선순위를 가집니다. 반면에 백그라운드 앱은 화면 밖에 있기 때문에 가능한 한 작업을 적게 수행해야 하며, 가급적 아무것도 수행하지 않는 것이 좋습니다.앱의 상태가 변경되면 UIKit은 적절한 델리게이트 객체의 메서드를 호출하여 사용자에게 알립니다.iOS 13 이상: Scene 기반 앱의 생명 주기 이벤트에 응답하기 위해 UISceneDelegate 객체를 사용합니다.iOS 12 이전: ..
문제let client = Supabaseclient(supabaseURL, supabaseKey)client.from("Character").select().exectue()해당 코드를 실행했을 때 응답 코드는 200으로 문제없이 응답은 왔으나, Table의 데이터는 들어오지 않는 문제가 발생하였습니다.원인과 해결 과정원인은 몇 가지가 복합적으로 존재했는데요! 문제는 다음과 같았습니다.칼럼 네임 실수CodingKeys로 키를 맞춰줄 때 이름을 실수하는 문제가 있었습니다!RLS (Row Level Security)데이터베이스에 특정 사용자나 그룹이 특정 행에만 접근할 수 있도록 하는 보안 매커니즘Supabase의 DB에 접근하기 위해서는 Project URL과 API Key가 필요한데, API Key에는..