[RxSwift] Custom Binder

RudinP·2025년 11월 12일
0

Study

목록 보기
376/380

Binder

    /// Initializes `Binder`
    ///
    /// - parameter target: Target object.
    /// - parameter scheduler: Scheduler used to bind the events.
    /// - parameter binding: Binding logic.
    public init<Target: AnyObject>(_ target: Target, scheduler: ImmediateSchedulerType = MainScheduler(), binding: @escaping (Target, Value) -> Void) {
        weak var weakTarget = target

        self.binding = { event in
            switch event {
            case .next(let element):
                _ = scheduler.schedule(element) { element in
                    if let target = weakTarget {
                        binding(target, element)
                    }
                    return Disposables.create()
                }
            case .error(let error):
                rxFatalErrorInDebug("Binding error: \(error)")
            case .completed:
                break
            }
        }
    }
  • UIBinding에 사용하는 옵저버
  • 초기화 시 UI객체를 전달
  • 메인스케줄러 사용(UI관련이니까)
  • 보통 클로저의 Value에 있는 값을 Target에 저장하는 방식으로 구현

custom extension

extension Reactive where Base: UILabel {
    var segmentedValue: Binder<Int> {
        return Binder(self.base) { label, index in
            switch index {
            case 0:
                label.text = "Red"
                label.textColor = .red
            case 1:
                label.text = "Green"
                label.textColor = .green
            case 2:
                label.text = "Blue"
                label.textColor = .blue
            default:
                label.text = "Unknown"
                label.textColor = .black
            }
        }
    }
}
//viewDidLoad
        colorPicker.rx.selectedSegmentIndex
            .bind(to: valueLabel.rx.segmentedValue)
            .disposed(by: bag)
  • 동일하게 클로저의 value 값을 target에 저장하는 방식
  • 메인스케줄러에서 실행됨이 보장되기 때문에 생략
profile
iOS 개발자가 되기 위한 스터디룸/스터디의 레퍼런스는 모두 kxcoding

0개의 댓글