import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
@IBOutlet weak var numberLabel: UILabel!
@IBOutlet weak var increaseButton: UIButton!
private let disposeBag = DisposeBag()
private var number = BehaviorRelay<Int>(value: 0)
override func viewDidLoad() {
super.viewDidLoad()
// increaseButton의 탭 이벤트를 감지하여 number를 1씩 증가
increaseButton.rx.tap
.subscribe(onNext: { [weak self] in
guard let self = self else { return }
self.number.accept(self.number.value + 1)
})
.disposed(by: disposeBag)
// number의 변화를 감지하여 레이블 업데이트
number
.map { "\($0)" }
.bind(to: numberLabel.rx.text)
.disposed(by: disposeBag)
}
}
왜 굳이 BehaviorRelay으로 현재값(number)을 저장할까?
비동기 프로그래밍에서 상태 변화를 감지하고 이벤트에 반응하기 위해서 사용됩니다.
private var number = BehaviorRelay<Int>(value: 0)
버튼을 눌렀을때 number변수의 상태 변화를 체크하기 위해 BehaviorRealy 클래스를 사용했습니다. int 형태로 초기값을 0으로 설정하는 코드입니다.
BehaviorRelay 클래스의 accept 메소드
accept 메소드는 BehaviorRelay클래스의 내부값을 변경하고 변경된 값을 현재 구독자 혹은 새로운 구독작에게 즉시 전달하는 데 사용합니다.
func accept(_ event: Element)
accept 메소드의 메서드 시그니쳐 입니다.
이때 파라미터의 Element 타입은 BehaviorRelay의 값의 타입니다. 현재 int형태를 가지고 있습니다.
self.number.accept(self.number.value + 1)
number의 값을 참조하기 위해 value 프로퍼티로 참조합니다. 버튼을 눌렀을때 현재값에서 1을 증가합니다.
increaseButton.rx.tap
.subscribe(onNext: { [weak self] in
guard let self = self else { return }
self.number.accept(self.number.value + 1)
})
.disposed(by: disposeBag)
위에 코드는 increaseButton의 탭 이벤트를 감지하여 number를 1씩 증가
.subscribe()메소드를 통해서 해당 옵저버블을 구독합니다. 구독을 함으로써 옵저버블의 이벤트를 감지가 가능하게 되고의 이벤트가 발생하였을때 어떤 동작을 할지 정의할 수 있습니다.
[weak self]의 의미??
increaseButton.rx.tap
.subscribe(onNext: { [weak self] in
guard let self = self else { return }
self.number.accept(self.number.value + 1)
})
.disposed(by: disposeBag)
결론적으로 먼저 설명하자면 onNext 파라미터로 들어오는 인자 클로져에서 사용하는 외부 변수(self == viewController)를 약한 참조하겠다는 것을 의미합니다.
자세한 설명을 "클로져 캡쳐" 게시물에서 설명하겠습니다.
옵저버블 변수 number 처리
number
.map { "\($0)" } // .map() 메소드를 통해서 number의 정수값을 문자열로 타입 변환해줍니다.
.bind(to: numberLabel.rx.text) // .bind() 메소드를 통해서 옵져버블 변수 number를 numberLabel와 바인딩 해줍니다.
.disposed(by: disposeBag) //disposeBag에 옵저버블을 추가하여 해당 옵저버블이 해제될 때 사용된 리소스를 정리합니다.
'RxSwift' 카테고리의 다른 글
RxSwift) Observer (0) | 2024.01.29 |
---|---|
RxSwift) RxSwift, 반응형 프로그래밍 (1) | 2024.01.16 |
RxSwfit) Subject (0) | 2023.01.06 |
RxSwift) Observer (0) | 2023.01.06 |