[ swift ] RxSwift 연습

sonny·2025년 1월 18일
0

TIL

목록 보기
106/133
post-thumbnail

import UIKit
import RxSwift
import RxCocoa
import SnapKit

class ViewController: UIViewController {
    let disposeBag = DisposeBag()
    
    private let button = UIButton(type: .system)
    private let textField = UITextField()
    private let label = UILabel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .darkGray
        setupUI()
        bindActions()
    }
    
    private func setupUI() {
        [
            textField,
            button,
            label
        ].forEach { view.addSubview($0) }
        
        textField.placeholder = "아무 글을 입력하세요...."
        textField.borderStyle = .roundedRect
        
        button.setTitle("Tap Me", for: .normal)
        button.setTitleColor(.white, for: .normal)
        button.backgroundColor = .brown
        button.layer.cornerRadius = 15
        
        label.textColor = .white
        label.textAlignment = .center
        
        textField.snp.makeConstraints {
            $0.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(50)
            $0.centerX.equalToSuperview()
            $0.width.equalToSuperview().multipliedBy(0.8)
        }
        
        button.snp.makeConstraints {
            $0.top.equalTo(textField.snp.bottom).offset(20)
            $0.centerX.equalToSuperview()
            $0.width.equalToSuperview().multipliedBy(0.3)
            $0.height.equalTo(50)
        }
        
        label.snp.makeConstraints {
            $0.top.equalTo(button.snp.bottom).offset(20)
            $0.centerX.equalToSuperview()
            $0.width.equalToSuperview().multipliedBy(0.8)
        }
    }
    
    private func bindActions() {
        let textObservable = textField.rx.text.orEmpty.asObservable()
        let buttonTapObservable = button.rx.tap
        
        buttonTapObservable
            .withLatestFrom(textObservable)
            .subscribe(onNext: { [weak self] text in
                self?.label.text = "Typed: \(text)"
            })
            .disposed(by: disposeBag)
    }
}

RxCocoa로 UI 컴포넌트를 반응형으로 사용해봤다.

textField.rx.text와 button.rx.tap을 Observable로 변환하여 데이터를 처리해봤고,
UI 이벤트를 선언적으로 처리하는 Rx의 장점을 알 수 있었다.

그리고 RxSwift의 연산자를 사용했는데

withLatestFrom 연산자를 활용해 이벤트 결합을 처리했는데 버튼 클릭 시점에 텍스트 필드의 최신 데이터를 가져오는 방식은 Rx의 핵심 개념 중 하나인 데이터 스트림 결합이라는데 이번 예제로 조금이나마 이해해볼 수 있었다.

그리고 disposeBag을 사용해 구독 해제를 관리하여 Rx의 메모리 관리 방법을 익혀봣는데 다른 예제를 더 해봐야될 것 같다.

음 버튼 클릭과 텍스트 필드 값 결합은 비교적 간단한 작업이긴 하다보니.. RxSwift의 비동기 처리 능력을 깊이 다루지는 않은 것 같다.

"RxSwift를 꼭 써야 했을까?"라는 질문이 나올 수 있는 코드인 셈..

그리고 복잡한 데이터 흐름이 없는것도..

보면 RxSwift의 진가는 복잡한 비동기 작업이나 여러 데이터 흐름을 조합한다던지 아니면 에러 처리에서 발휘된다고 하는데,

현재 코드는 버튼 클릭과 텍스트 필드만 다루고 있어서 Rx의 전체적인 잠재력을 경험하기엔 부족한 것 같긴하다.

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보