RxSwift를 사용하여 iOS Todo 애플리케이션 만들기

  • RxSwift와 RxCocoa를 사용하여 Todo 애플리케이션을 만들어보았다.
  • import RxSwiftimport RxCocoa를 해준다.

RxSwift란?

  • Reactive Programming이라는 프로그래밍 패러다임을 라이브러리로 구현한 오픈 소스이다.
  • RxSwift는 ReactiveX라는 MS에서 만든 개념을 라이브러리로써 만들었다.
  • 자매품으로 RxJava, RxKotlin, RxRuby 등 다양한 Rx구현체가 있다.
  • Reactive Programming이란 반응형 프로그래밍이라는 뜻으로, 어떠한 변화가 있을 경우 그것을 감지하여 이벤트를 발생시켜주는 프로그래밍 방법을 말한다.

    RxCocoa는 Cocoa 프레임워크에 있는 것들을 Rx로 사용할 수 있게 만들어주는 라이브러리이다.

RxSwift 용어

  • Subject : Observable과 Observer를 한꺼번에 부르는 용어
  • BehaviorSubject : 구독하면 Subject에 의해 반환한 가장 최근 값을 가져오고, 구독 이후에 반환하는 값을 가져온다.
  • PublisherSubject : 구독하면 구독 이후에 반환하는 값을 얻게 된다.
  • ReplaySubject : 구독하면 구독 이후에 반환하는 값 뿐만 아니라, 구독 이전에 반환한 값을 가져온다. Subject를 초기화할 때 알 수 있는 ReplaySubject의 버퍼 사이즈의 만큼 과거의 값을 가져온다.

    Variable : BehaviorSubject를 감싸는 .onNext() 이벤트만 제출할 수 있는 래퍼이다. (BehaviorSubject 를 사용하면 .onError(), .onCompleted() 전송에 직접 접근할 수 있다) Variable은 할당 해제될 때 자동으로 .onCompleted() 이벤트를 보낸다.

storyboard 연결

Image

ViewController.swift

class ViewController: UIViewController {
    
    // MARK: Properties
    
    @IBOutlet var todoTextField: UITextField!
    @IBOutlet var addButton: UIButton!
    @IBOutlet var tableView: UITableView!
    
    var todos = [String]()
    var todosRelay = BehaviorRelay(value: [String]())
    
    let disposeBag = DisposeBag() // 뷰가 할당 해제될 때 놓아줄 수 있는 일회용품의 가방
    
    // MARK: Life Cycles

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 코드에서 CellReuseIdentifier를 적용해줬다
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "TodoCell")
        
        // Rx에 관련된 초기화를 해줬다
        self.bindToRx()
    }
    
    // MARK: Rx
    
    func bindToRx() {
        // 만약 addButton을 클릭했을 경우
        self.addButton.rx.tap.subscribe(onNext: {
            // 텍스트 필드가 비어있으면 아무일 없도록
            guard self.todoTextField.text?.isEmpty == false else {
                return
            }
            
            self.todos.append(self.todoTextField.text!) // todos에 데이터 추가
            self.todosRelay.accept(self.todos) // 변화를 감지하기 위해 BehaviorRelay에 todos를 accept해줌
            self.todoTextField.text = "" // 텍스트 필드를 비워줌
        }).disposed(by: self.disposeBag)
        
        // todos 데이터에 변화가 생겼을 경우
        self.todosRelay
            .bind(to: self.tableView.rx.items(cellIdentifier: "TodoCell")) { // tableView에 바인드
                (index, todo: String, cell: UITableViewCell) in
                cell.textLabel?.text = todo // textLabel 적용
            }.disposed(by: self.disposeBag)
    }
    
}

결과

Image


Choi Hyowon

열심히 공부 중 입니다.