[RxSwift Book] Chapter 12: Beginning RxCocoa


이 포스트는 RxSwift - Reactive Programming with Swift 책의 챕터 12에서 눈에 띄는 내용들만 요약해 둔 것입니다. 참고 바랍니다.

1. RxCocoa

  • UI Control과 다른 SDK 클래스를 wrapping한 커스텀 extension set
  • iOS, tvOS, macOS의 모든 플랫폼에서 동작

2. ObserverType과 ObservableType

  • ObserverType : 값을 주입(Inject)시킬 수 있는 타입
  • ObservableType : 값을 관찰할 수 있는 타입

ControlProperty

Subject 같이 프로퍼티에 새 값을 주입시킬 수 있고(ObserverType) 값의 변화도 관찰할 수 있는 타입(ObservableType).

  • 예) UITextField+Rx.Swift의 text 프로퍼티는  ControlProperty
extension Reactive where Base: UITextField {
    /// Reactive wrapper for `text` property.
    public var text: ControlProperty<String?> {
        return value
    }
    //  이후 내용 생략
}
  • ontrolProperty는 ControlPropertyType를 따름
public struct ControlProperty<PropertyType> : ControlPropertyType {
// 이후 내용 생략
}
  • ControlPropertyType은 ObservableType과 ObserverType을 따름을 확인
public protocol ControlPropertyType : ObservableType, ObserverType {
    /// - returns: `ControlProperty` interface
    func asControlProperty() -> ControlProperty<Element>
}

Binder

  • ObserverType을 따름. 값을 주입시킬 수는 있지만, 값을 관찰할 수는 없음.
    • 특징 : error를 값으로 받을 수 없음. error가 주입되면 Binder는 debug모드에서 fatalError()발생시킴. production 모드에서는 런타임 에러로그를 출력.
  • 예) UILabel+Rx.Swift에서 text 바인더 프로퍼티는 값을 주입만 시킬 수 있음.
extension Reactive where Base: UILabel {
    /// Bindable sink for `text` property.
    public var text: Binder<String?> {
        return Binder(self.base) { label, text in
            label.text = text
        }
    }
  • Binder는  ObserverType를 따름을 확인
public struct Binder<Value>: ObserverType {
// 이후 내용 생략
}

3. Observable의 Binding

RxCocoa에서 binding은 단방향 binding

unidirectional

Bind(to:)

  • bind(to:)는 subscribe()의 별칭(alias or syntatic sugar)
  • bind(to: observer)를 호출하면 실제로는 subscribe(observer)가 실행됨

4. Trait

Trait이란? UI 작업시 코드를 쉽고 직관적으로 작성해 사용할 수 있도록 도와주는 특별한 Observable 클래스의 모음

Trait의 규칙

  • error를 방출하지 않음
  • 메인스케쥴러에서 observe 됨
  • 메인스케쥴러에서 subscribe
  • Signal을 제외한 나머지 Trait은 자원을 공유함(e.g share(replay:1))

RxCocoa의 Traits

  • ControlProperty : 컨트롤에 data를 binding 하기 위해 사용 (rx namespace 사용)
  • ControlEvent : 컨트롤의 event를 수신하기 위해 사용
  • Driver : error를 방출하지 않고 메인스레드에서 처리됨
  • Signal : Driver와 거의 동일. 한가지 다른 점은 자원을 공유하지 않음. (share(replay:1) 사용하지 않음). 즉, 새로운 subscriber에게 마지막 엘리먼트를 보내주지 않음
    • Signal은 event모델링에 유용하고, Driver는 state모델링에 더 적합

Driver와 ControlProperty의 사용

let search = searchCityName.rx.text.orEmpty
	.filter { !$0.isEmpty }
	.flatMapLatest { text in 
	return ApiController.shared.currentWeather(city: text)
	.catchErrorJustReturn(ApiController.Weather.empty)
	}
	.asDriver(onErrorJustReturn: ApiController.Weather.empty)
  • .asDriver(onErrorJustReturn:) : Observable에서 error가 방출됐을때 Driver에서  error대신 지정한 기본 값을 리턴하도록 만들어 Driver에서 error가 방출되는 것을 막음

bind(to:) 코드 대신 drive() 코드 사용하기

  • 변경 전 : bind(to:) 사용
search.map { $0.icon }
   .bind(to: iconLabel.rx.text)
   .disposed(by: bag)

search.map { "\($0.humidity)%"}
   .bind(to: humidityLabel.rx.text)
   .disposed(by: bag)

search.map { $0.cityName }
   .bind(to: cityNameLabel.rx.text)
   .disposed(by: bag)
  • 변경 후 : drive사용
search.map { $0.icon }
   .drive(iconLabel.rx.text)
   .disposed(by: bag)

search.map { "\($0.humidity)%"}
   .drive(humidityLabel.rx.text)
   .disposed(by: bag)

search.map { $0.cityName }
   .drive(cityNameLabel.rx.text)
   .disposed(by: bag)

5. RxSwift와 RxCocoa에서의 Traits

Read more

카카오모빌리티 5년, 그 경험과 생각

2018년부터 2024년까지 5년 동안 카카오모빌리티에서 개발자로 일하며 얻은 경험과 느낀 점을 정리해 보았습니다. 개인적인 관점에서 작성된 내용이며, 제 경험이 회사 전체를 대표하지는 않습니다. 일 * 리더의 변화가 회사 분위기를 바꾼다. * 재직 중 CEO가 한 번 교체되었고, 그 후 CTO를 비롯한 여러 리더들이 함께 교체되었습니다. * 리더가 바뀌니 마치 다른 회사에 다니는 것처럼

By 토미
복잡한 마음이 든다면 적어보세요.

복잡한 마음이 든다면 적어보세요.

살다보면 분노, 불안, 우울 등 부정적인 감정이 찾아옵니다. 이런 감정은 시간이 지나면 금새 사라지기도 하지만, 때로는 계속 불쑥 불쑥 올라와서 마음을 혼란에 빠뜨립니다. 이럴 땐 한번 적어보세요. 내 마음은  왜 화가 났는지, 왜 불안한지, 왜 우울한지, 적다보면 부정정인 감정의 근본 원인이 무엇인지 그 감정을 어떻게 정리해야 할지 실마리를 찾을 수

By 토미
인생이란 책

인생이란 책

사람은 누구나 인생이란 책의 저자입니다.  모든 사람은 단 한 권의 책을 쓰고, 모든 책의 주인공은 저자 자신입니다.  1년의 삶을 한 페이지에 적는다고 했을 때, 책은 보통 80페이지 정도 되고, 많아도 120페이지를 넘기진 않습니다.  책에 한 번 써진 내용은 수정하거나 삭제할 수 없습니다. 마음에 들지 않는 페이지가 있더라도 찢어버릴 수 없습니다.

By 토미
박경리 - 산다는 것

박경리 - 산다는 것

체하면 바늘로 손톱 밑 찔러서 피 내고 감기들면 바쁜듯이 뜰 안을 왔다갔다 상처나면 소독하고 밴드하나 붙이고 정말 병원에는 가기 싫었다 약도 죽어라 안 먹었다 인명재천 나를 달래는 데 그보다 더 생광스런 말이 또 있을까 팔십이 가까워지고 어느 날부터 아침마다 나는 혈압약을 꼬박꼬박 먹게 되었다 어쩐지 민망하고 부끄러웠다 허리를 다쳐서 입원했을

By 토미


[책] 토미의 Git with 소스트리

Git을 제대로 알고 싶으신 분들께 추천드립니다.



[온라인 강의] 토미의 Git & Github

Git을 제대로 알고 싶으신 분들께 추천드립니다.