 iOS

RxRelay? - Relay와 Subject의 차이 Relay는 Subject의 Wrapper 클래스로, PublishRelay와 BehaviorRelay가 있습니다. BehaviorRelay의 소스 코드를 확인해보면서 공부해보도록 하겠습니다. public final class BehaviorRelay: ObservableType { private let subject: BehaviorSubject /// Accepts `event` and emits it to subscribers public func accept(_ event: Element) { self.subject.onNext(event) } /// Current value of behavior subject public var value: ..
extension Reactive의 사용 이번 포스팅에서는 아래 예시처럼 일반적으로 많은 프로젝트에서 Reactive를 extension해서 사용하는데, Reactive가 무엇이고 왜 사용하는지에 대해 공부한 것을 정리하고자 합니다. // 예시 class MainViewController: UIViewController { } extension Reactive where Base: MainViewController { var setAlert: Binder { ... } } Reactive.swift 파일의 코드는 다음과 같습니다. 한줄 한줄 천천히 이해해보도록 하겠습니다. /* Reactive.swift */ @dynamicMemberLookup public struct Reactive { public ..
switch 는 암시적인 진행을 사용하지 않는다! (No Implicit Fallthrough) Swift 에서는 break 를 적지 않아도, 특정 case 가 완료되면 자동으로 switch 구문을 빠져 나오게 된다. 이런 사용법으로 인해 실수로 break 를 적지않아 의도하지 않은 case 문이 실행되는 것을 방지한다. break 가 Swift에서 필수는 아니지만, case 안에 특정 지점에서 멈추도록 하기 위해 break 를 사용할 수 있다. switch 문의 특징 1. case 안에는 최소 하나의 실행 구문이 있어야 한다. let anotherCharacter: Character = "a" switch anotherCharacter { case "a": // Invalid, case문에 body가 ..
RxSwift 의 Error 관리 RxSwift 에서의 에러 관리는 프레임워크 중 하나로 분리되어 있다. 바로 catch 와 retry. 따로 따로 사용하기 보다 catch 와 retry 를 조합해서 사용할 수 있을 것이다. "몇번 까지 재시도 후, 안되면 에러를 특정 방식으로 내뱉어라" 등으로 말이다. catch default value 로 에러를 복구하는 방식 RxSwift 에는 catch 계열의 두 가지 주요 연산자가 있다. ① catch 먼저 catch 연산자이다. 클로저를 매개변수로 받아서 완전히 다른 형태의 Observable 로 반환해주는 연산자이다. func catch(_ handler:) -> RxSwift.Observable 예시는 다음과 같다. enum MyError: Error { ..
replay 반복하는앵무새🦜에 대해 subscribe 하기 전에 "인사말"에서 이벤트를 방출하고 있었다. subscribe 를 늦게 하더라도 replay 에 선언한 buffer 1 만큼의 이전에 방출된 이벤트의 값을 가져올 수 있다. 물론, subscribe 이후 발생하는 이벤트에 대해서는 값을 가져온다. print("----------replay----------") let 인사말 = PublishSubject() let 반복하는앵무새🦜 = 인사말.replay(1) 반복하는앵무새🦜.connect() 인사말.onNext("1. hello") 인사말.onNext("2. hi") 반복하는앵무새🦜 .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 인사말..
reduce 제공된 초기값(0)에서 시작해서, source observable 이 방출할 때마다 값을 가공한다. Observable.from((1...10)) // .reduce(0, accumulator: { summary, newValue in // return summary + newValue // }) .reduce(0, accumulator: +) .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) ----------reduce---------- 55 scan 매번 값이 들어올 때마다 변형된 값들을 방출한다. print("----------scan----------") Observable.from((1...10)) .scan(0, accum..
withLatestFrom 💥🔫 의 withLatestFrom 연산자에 '달리기선수' 라는 Observable 을 두면 💥🔫 가 이벤트를 방출하였을 때, '달리기선수'가 방출하였던 제일 최신 값이 방출된다. print("----------withLatestFrom----------") let 💥🔫 = PublishSubject() let 달리기선수 = PublishSubject() 💥🔫.withLatestFrom(달리기선수) // .distinctUntilChanged() //Sample과 똑같이 쓰고 싶을 때 .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 달리기선수.onNext("🏃🏻‍♀️") 달리기선수.onNext("🏃🏻‍♀️ 🏃🏽‍♂️")..
startWith 현재 위치, 네트워크 연결 상태 등 현재 상태, 초기값이 필요한 상황이 있다. 이때 이를 맨 앞에 붙일 수 있다. print("-----startWith------") let zoo = Observable.of("🐳", "🐕", "🦢") zoo .enumerated() .map { (index, element) in return "아기 " + element + " \(index)" } .startWith("🧑‍🌾사육사") // String - Observable 로 방출되는 값과 동일한 타입의 값이 들어가야 한다. .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) -----startWith------ 🧑‍🌾사육사 애기 🐳 0 애기..
combineLatest 여러 TextField 를 한번에 관찰하고 값을 결합하거나, 여러 소스들의 상태를 보는 경우 많이 사용한다. 다음은 두 개의 TextField 인 idField, pwField 의 combineLatest 처리 예시이다. checkEmailValid 와 checkPasswordValid 는 리턴 값이 Bool 이고, 이에 따라 loginButton 의 활성화를 표현한다. idField 의 값이 변경되면, 변경된 값을 통해 checkEmailValid 함수를 통과됨과 동시에, 자동으로 가장 최신의 pwField 의 값 또한 checkPasswordValid 함수를 통과하게 된다. 마찬가지로 pwField 값이 변경되면 반대로 적용된다. 즉, 최종적으로 반환하고자 하는 값을 위해 여..
RxSwift 와 MVVM 디자인 패턴 https://younngjun.tistory.com/41 MVC 구조의 한계와 MVVM 출처 : fastcampus - 30 개 프로젝트로 배우는 iOS 앱 개발 MVC 디자인 패턴의 장점과 한계 기본적으로 Model, View, Controller 로 이루어져 있는 디자인 패턴이다. Apple 은 MVC 장점을 다음과 같이 정의한다. - younngjun.tistory.com 앞서 MVVM 디자인 패턴의 개념과 함께 MVVM 으로 디자인 된 앱 위에서 RxSwift 의 강력함을 짚고 넘어갔었다. 이번 공부에서는 왜 RxSwift 가 MVVM 과 함께 사용되었을 때 강력한지에 대해 이해해본다. struct Menu { var name: String var coun..
Younngjun
' iOS' 카테고리의 글 목록