관리 메뉴

김종권의 iOS 앱 개발 알아가기

[RxSwift] 10. share Operators 본문

RxSwift/RxSwift 기본

[RxSwift] 10. share Operators

jake-kim 2020. 6. 24. 19:46

Share() 연산자는 자원을 공통으로 사용 할 수 있게끔 하는 개념

 

1. Share을 쓰는 이유

1) MVVM설계

// ViewModel 정의
class SomeViewModel {
	let result = userTappedButton
    				.flatMapLatest {apiService.rx.getFriend() }
	name = result.map {$0.name}
    phone = result.map {$0.phone}
}

// ViewController에서 ViewModel과 UI연결
class {
	...
    viewModel.name
    	.bind(to: lblName.rx.text) // UI와 ViewModel간의 연결
        .disposed(by: bag)
        
    viewModel.phone
    	.bind(to: lblPhone.rx.text)
        .disposed(by: bag)
}

연결된 결과(MVVM패턴)

2) 문제점

subscriber1(name), subscriber2(phone)는 각각 각자의 stream을 사용하는 것

 

아래와같이 map연산자를 사용한다면, 더욱더 추가적인 2개의 독립 자원과 스트림이 필요

viewModel.name
	.map {$0.isEmpty}
	.bind(to: lblName.rx.text) // UI와 ViewModel간의 연결
	.disposed(by: bag)
        
viewModel.phone
	.map {$0.isEmpty}
   	.bind(to: lblPhone.rx.text)
	.disposed(by: bag)

2. share() 연산자 사용하여 해결

share() 사용 -> 하나의 stream을 공통으로 사용

class SomeViewModel{
	let result = userTappedButton
    				.flatMapLatest {apiService.rx.getFriend()}
                    .share() // subscriber들에게 스트림의 자원들을 공유
	name = result.map{$0.name}
    phone = result.map{$0.phone}
}

* 참고 : medium.com/gett-engineering/rxswift-share-ing-is-caring-341557714a2d

Comments