RxSwift) 간단한 숫자 증가앱

2024. 1. 15. 20:26· RxSwift
목차
  1. 왜 굳이 BehaviorRelay으로 현재값(number)을 저장할까?
  2. BehaviorRelay 클래스의 accept 메소드
  3. [weak self]의 의미??
  4. 옵저버블 변수 number 처리
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
  1. 왜 굳이 BehaviorRelay으로 현재값(number)을 저장할까?
  2. BehaviorRelay 클래스의 accept 메소드
  3. [weak self]의 의미??
  4. 옵저버블 변수 number 처리
'RxSwift' 카테고리의 다른 글
  • RxSwift) Observer
  • RxSwift) RxSwift, 반응형 프로그래밍
  • RxSwfit) Subject
  • RxSwift) Observer
성실농장주
성실농장주
매일 조금이라도 꾸준히 성장하고 싶은 개발자
성실농장주
사과농장
성실농장주
전체
오늘
어제
  • 분류 전체보기 (43)
    • iOS 개발공부📱 (4)
    • Swift🐤 (12)
    • SwiftUI🐧 (2)
    • Firebase 🔥 (1)
    • Git 🐈 (2)
    • Linux (1)
    • Trouble Shooting🛠️ (2)
    • 자료구조🏛️ (1)
    • visionOS 개발공부👓 (1)
    • Algorithm💡 (4)
    • RxSwift (5)
    • 오픈소스 (1)
    • ios 개발자 면접 질문🥸 (6)
    • 영어문서 단어집📕 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • responder_chain
  • git
  • process_states
  • CLLocationDegrees
  • nested_function
  • control_transfer_statement
  • Array
  • Xcode
  • rethrows
  • Set
  • process_control_block
  • RxSwift
  • Tuple
  • Debug View Hierarchy
  • iOS_process_management
  • processor_management
  • colorScheme
  • SWIFT
  • optional_chaining
  • EnvironmentValues

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
성실농장주
RxSwift) 간단한 숫자 증가앱
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.