Xcode Cloud제가 만든 앱인 TK8 - 철권8 프레임 데이터 앱을 여태껏 배포할 때는 구현 완료 후 직접 아카이빙하는 과정을 거쳤습니다.최근 다른 사이드 프로젝트에서 Xcode Cloud 도입을 고려하게 되었는데, 미리 선제적으로 경험해보고자 제 개인 프로젝트에 먼저 도입하기로 했습니다.도입 자체는 매우 간단합니다.App Store Connect 에서 Xcode Cloud를 도입할 앱을 선택한 뒤 Xcode Cloud 탭에서 Xcode Cloud를 적용할 수 있습니다.워크플로 관리에서 새 워크플로 생성 을 통해서 각각 워크플로의 환경과, 실행 조건을 정해줄 수 있습니다.저는 별도의 Secrets.xcconfig 를 통해서 API Key 값을 관리하고 있었으므로, 환경 변수를 여기서 추가해주었습니다..
ScrollViewReader💡SwiftUI에서 ScrollView를 코드로 원하는 위치까지 이동시키기 위해 사용하는 컨테이너ScrollViewReader 는 내부 콘텐츠에 접근할 수 있는 ScrollViewProxy 를 클로저로 제공함해당 proxy 를 이용하면 특정 id 를 가진 View까지 스크롤 가능ScrollViewReader { proxy in ScrollView { ForEach(0..ScrollViewProxy 란?proxy 는 일반적으로 어떤 대상에 직접 접근하는 대신, 그 대상을 대신해서 조작할 수 있도록 제공되는 객체따라서 SwiftUI에서는 내부적으로 관리되는 ScrollView 자체를 직접 가져와서 조작하는 것이 아니라, 스크롤을 조작할 수 있는 인터페이스를 제..
요약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..