RxSwift + MVVM
[RxSwift] CollectionView또는 TableView 셀의 UIImageView or UIButton 클릭 이벤트 처리
UITableViewCell의 ImageView 클릭이벤트 처리 Cell에서 ImageView의 탭제스처 감지 후 옵저버블로 방출 ViewController에서는 옵저버블 구독 후, ViewModel로 전달 ViewModel은 이벤트를 받아 처리하고, 필요한 데이터 업데이트 수행 방법 1. ViewController에서 바로 ViewModel로 전달 Cell import UIKit import RxSwift import RxCocoa class MyTableViewCell: UITableViewCell { @IBOutlet weak var myImageView: UIImageView! private var disposeBag = DisposeBag() private var indexPath: IndexP..
[RxSwift] throttle, debounce
throttle( x, latest = true) 주로 버튼의 중복 입력 방지에 사용된다. latest 의 기본값은 true이다. 코드 let input = EditProfileViewModel.Input( imageViewButtonTapped: profileImageView.button.rx.tap .throttle(.seconds(10), scheduler: MainScheduler.asyncInstance), 이렇게 설정하게 되면 Input으로 첫 Event가 발생하면 Event를 방출하고 10초동안 무시한 뒤 10초가 지나면 가장 마지막이벤트를 전달한다. 물론 1개의 이벤트만 발생했다면 최초 1개의 이벤트만 방출한다. let input = EditProfileViewModel.Input( set..
[RxSwift] RxDataSource로 CollectionView 사용하기
RxDataSource RxDataSource를 활용해 CollectionView를 사용하는 방법을 정리해보려고 한다. RxDataSource가 필요한 이유 일반적인 상황에선 DataSource를 사용해 데이터를 표현하지만 Rx를 사용할 경우 아래와 메서드를 활용한다. collectionView.rx.items(cellIdentifier: ) collectionView.rx.items(source: ) collectionView.rx.items(dataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource) 이런 메서드를 통해 아래와 같은 방법으로 RxCocoa를 활용해 데이터를 표현한다. let data = Observable.just(..
RxSwift를 이용한 method 호출 구독
RxSwift에서 swizzling을 통해 특정 메서드의 호출 전, 후에 대한 이벤트를 구독할 수 있다. public func sentMessage(_ selector: Selector) -> Observable public func methodInvoked(_ selector: Selector) -> Observable sentMessage: 메서드가 호출되기 전 methodInvoked: 메서드가 호출된 후에 실행 extension Reactive where Base: UIViewController{ var viewDidLoad: ControlEvent { let source = self.methodInvoked(#selector(Base.viewDidLoad)).map { _ in } return ..
[Rx + MVVM] Input과 Output을 사용한 MVVM
iOS의 MVVM패턴에는 표준이 없고 구현하는 사람마다 패턴이 조금씩 다르다. 그 중에 Kickstarter에서 사용하는 Input과 Output Protocol을 사용하는 방식이 있다. 방법 1. transform을 이용하여 입력을 넣어주고 출력을 받는 방법 Protocol with Input & Output protocol ViewModelType{ associatedtype Input associatedtype Output var disposeBag: DisposeBag { get set } func transform(input: Input) -> Output } ViewModel에서 사용할 Protocol을 만들어준다. import Foundation import RxSwift import RxC..
RxSwift - Single, Maybe, Completable
Single, Maybe, Completable은 다른 옵저버블보다 좁은 범위의 옵저버블이다. 선택적으로 사용할 수 있는데, 이런 좁은범위의 옵저버블을 사용하는 이유는 코드 가독성을 높이는데 있다. Single Single은 두가지 이벤트만 방출한다. .success(): next event와 complete 를 합친것과 같다. 값을 포함해서 방출한다. .error() 파일 저장이나 다운로드, 디스크에서 데이터 로딩과 같이 기본적으로 값을 산출하는 비동기적 연산에 사용되게된다. 사진을 저장하는 옵저버블이 있을 때 저장을 했느냐, 에러가 났느냐 처럼 정확히 한가지 요소만을 방출하는 연산자를 매핑할 때 유용하다. 정확히 한가지 요소만을 방출할 수 있다. NextEvent와 Completed Event를 합친..
RxSwift + MVVM 곰튀김님
유튜브 곰튀김님의 영상을 보고 정리. https://www.youtube.com/watch?v=iHKBNYMWd5I&list=PL03rJBlpwTaBrhux_C8RmtWDI_kZSLvdQ&index=2 Subject Subject: 옵저버블처럼 구독할 수 있고, 옵저버블 밖에서 값을 받아 데이터를 컨트롤해서, 새로운 값을 집어넣어 줄 수 있는것. PublishSubject 구독이 시작되고 전달되는 이벤트를 전달한다. BehaviorSubject 기본값을 가지고 시작한다. 구독을 시작한 시점에 데이터가 전달이 안되었다면 기본값을 내려주고, 새로운 구독자가 생기면 가장 최근에 전달된 값을 전달한다. AsyncSubject 데이터가 전달되고, 여러 구독자가 생기더라도 데이터를 내려보내주지 않는다. Comple..
[iOS]. MVVM 정리
MVC 정리 MVC패턴에서 사용자의 입력을 받게되는 부분은 Controller이다. Controller는 사용자의 입력을 받으면 Model에 데이터를 요청하거나, 데이터를 변형하거나 작업을 한다. 이후 Model은 View를 업데이트한다. View는 그리하여 Model과의 *의존성을 갖게된다. View와 Controller역시 데이터를 주고 받는 때들이 있기 때문에 의존성이 생길 수 있다. 가장 큰 문제는 View와 Model의 의존성이 생기는 것! *의존성: 서로 다른 객체 사이에 의존 관계가 있는것. 의존하는 객체가 수정되면 다른 객체도 영향을 줄 수 있다 iOS에선 사실 View와 Controller는 떼어놓기가 힘들다? iOS의 viewController라는 클래스 파일에 예를 들어 화면에 버튼을..