iOS/RxSwift
-
[RxSwift6] "withUnretained" operator로 리펙토링하기iOS/RxSwift 2022. 2. 2. 22:17
이전에 글로 남겼다시피 subscribe, bind, drive등을 통해서 구독할 때 순환참조의 문제점을 방지하기 위해서 weak self를 통해서 약한참조를 만들어주었다. observable .subscribe(onNext: { [weak self] (string) in guard let self = self else { return } self.doSomething(string) }) .disposed(by: disposeBag)이 방식은 확실한 방법이였지만, 보일러 플레이트가 계속해서 만들어져 코드를 지저분하게 만들었다. RxSwiftCommunity의 RxSwiftExt에 있던 withUnretained operator은 이런 코드를 조금 더 명료하게 만들어주어 인기가 많았고, RxSwift 6...
-
[RxSwift] weak, unowned self에 대한 의문iOS/RxSwift 2022. 1. 27. 23:57
일단 기본적으로 두 용어의 개념은 생략하고 쓰임새를 써보자면 다음과 같다. weak는 객체를 Optional로 참조하기 때문에, 참조하는 객체가 도중에 사라질 가능성이 있을 때 사용한다. unowned는 객체를 Non Optional로 참조하기 때문에, 참조하는 객체가 항상 존재함(필요할 때)을 가정한다. weak는 필요할 때마다 Unwrapping에 대한 코드를 작성해야 하기 때문에 불편하다.. 기존에 갖고있던 생각 이제 RxSwift에서 두 키워드의 쓰임에 대해서 생각해보자. RxSwift에는 Observable의 생명주기를 관리(?)해주는 dispose 메서드, 그것을 더 편하게 도와주는 DisposeBag이 있다. DisposeBag은 최대 생명주기가 부모객체의 생명주기와 같다. 부모 객체가 de..
-
[RxSwift] Error Handling [2]iOS/RxSwift 2022. 1. 27. 01:40
이전 글에서 Error Handling에 대해서 탐구하는 과정을 기록했다. 그 이후 여러가지 Demo나 Article을 읽으며 어떤 방식이 더 좋은 선택일지 고민했다. 수 개의 프로젝트를 살펴보았을 때, 대게 몇가지 패턴으로 에러를 처리하고 있었다. 그 중, 나는 materialize를 활용한 방식에 주목했다. 일단 이 방식이 입증된 방식인지를 알기 위해서 해당 키워드에 대한 수많은 검색을 통해서 저명한 개발자들의 활용사례를 발견할 수 있었다. 더보기 https://github.com/ReactiveX/RxSwift/issues/729#issuecomment-621606909 What is the correct way to handle errors? · Issue #729 · ReactiveX/RxSwi..
-
[RxSwift] Error Handling [1]iOS/RxSwift 2022. 1. 25. 20:51
아래 코드는 Firebase/Auth의 전화번호 로그인과 idtoken발급에 대한 예제코드에 RxSwift를 적용한 것이다. 네트워크 레이어 분리를 위해서 viewModel과 다른 클래스에 메서드를 작성해 주었다. 분리하기 이전에는 네트워크 통신시 에러가 발생했을 때, errorToast관련 Subject에 accept만 해주고 onNext를 방출할 수 있었다. 하지만 분리한 뒤에는, 에러가 발생했을 때 viewModel에게 명확하게 에러가 발생했다는 것을 전달해 주기 위해서 Single(.failure)을 사용해야겠다고 판단했다. 해당 상황을 예제코드로 옮기면 아래와 같다. // // ViewController.swift // Practice // // Created by SEUNGMIN OH on 2..
-
RxSwift로 리펙토링 맛보기iOS/RxSwift 2022. 1. 3. 16:27
과제중에 다음과 같은 화면을 구현하는것이 있었다. ViewController은 View를 소유하고 있어서, ViewController에서 View의 객체들에 addTarget을 구현해줬다. override func viewDidLoad() { super.viewDidLoad() mainView.startButton.addTarget(self, action: #selector(startButtonTapped), for: .touchUpInside) mainView.fotterLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(loginLabelTapped))) } @objc func startButtonTappe..
-
[Rxswift] 03.SubjectsiOS/RxSwift 2021. 12. 19. 21:03
이 게시글은 raywenderlich, RxSwift: Reactive Programming with Swift 책을 참고하여 작성한 글입니다. observerble은 RxSwift에서 필수적이지만, read-only이다. 할 수 있는것은, subscribe하고 그들이 생산하는 새로운 event를 알림받는것이다. observable과 observer의 역할을 모두 할 수 있는 것이 있는데, 바로 Subject 이다. 소개 example(of: "PublishSubject") { let subject = PublishSubject() // 1 subject.on(.next("Is anyone listening?")) // 2 let subscriptionOne = subject .subscribe(onNe..
-
[RxSwift] 02.Observables / rawiOS/RxSwift 2021. 12. 19. 01:17
What is an observable? *Observable* 은 Rx의 심장과도 같다. "observable", "observable sequence", "sequence"라고 Rx에서 서로 다른이름으로 불리는 것을 볼 수 있는데, 사실은 모두 같은 것이다. 때로는 다른 Rx 언어를 개발하던 사람이 "stream"이라고 불르는 경우가 있다. 사실 이것 또한 같은 것이다. RxSwift에서는 단 하나의 단어로 칭하는데, 바로 *Sequence* 이다. 결국 *Observable* 이란 sequence인데, 특별한 능력을 가진 sequence이다. 그 능력은 바로 *asynchronous* 이다. Observable은 시간의 흐름에 따라서 event를 생산하는데, 이것을 emtting이라고 부른다. Ob..
-
[RxSwift] 01.Fundamental / rawiOS/RxSwift 2021. 12. 19. 01:13
이 게시글은 raywenderlich, RxSwift: Reactive Programming with Swift 책을 참고하여 작성한 글입니다. *RxSwift, in its essence, simplifies developing asynchronous programs by allowing your code to react to new data and process it in a sequential, isolated manner*. RxSwift는 asynchronous programming 을 단순화해준다. 다른 여러가지 방법들 NotificationCenter delegate pattern Grand Centeral Dispatch Closure Foundation of RxSwift Observab..