[swift] RxCocoa를 활용한 화면 전환 처리 방법

이번 글에서는 Swift와 RxCocoa를 사용하여 iOS 앱에서 화면 전환을 처리하는 방법에 대해 알아보겠습니다. RxCocoa는 RxSwift를 위한 Cocoa 프레임워크로, 반응형 프로그래밍을 쉽게 구현할 수 있도록 도와줍니다.

1. RxCocoa 설치하기

RxCocoa를 사용하기 위해 먼저 CocoaPods를 통해 라이브러리를 설치해야 합니다. Podfile에 아래의 코드를 추가하고 pod install 명령어를 실행하세요.

pod 'RxSwift'
pod 'RxCocoa'

2. UIButton에 RxCocoa 적용하기

UIButton을 사용하여 화면 전환을 처리하기 위해, RxCocoa의 ControlEvent를 이용하면 됩니다. 아래의 예제 코드는 버튼을 탭했을 때, 다음 화면으로 전환하는 기능을 구현한 예입니다.

import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var nextButton: UIButton!

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        nextButton.rx.tap
            .subscribe(onNext: { [weak self] _ in
                let nextVC = NextViewController()
                self?.navigationController?.pushViewController(nextVC, animated: true)
            })
            .disposed(by: disposeBag)
    }
}

위의 코드에서는 nextButtonrx.tap을 적용하여 탭 이벤트를 구독하고, 탭 이벤트가 발생하면 NextViewController로 전환하는 코드를 작성하였습니다.

3. 다른 화면으로 데이터 전달하기

때로는 화면 전환 시 다른 화면으로 데이터를 전달해야 하는 경우가 있습니다. 이때는 RxCocoa의 Variable을 이용하여 데이터를 전달할 수 있습니다. 아래의 예제 코드는 이전 화면에서 입력한 데이터를 다음 화면으로 전달하는 기능을 구현한 예입니다.

class ViewController: UIViewController {
    @IBOutlet weak var nextButton: UIButton!
    @IBOutlet weak var textField: UITextField!

    let disposeBag = DisposeBag()
    let inputData = Variable<String>("")

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.rx.text.orEmpty
            .bind(to: inputData)
            .disposed(by: disposeBag)

        nextButton.rx.tap
            .subscribe(onNext: { [weak self] _ in
                let nextVC = NextViewController()
                nextVC.inputData = self?.inputData.value
                self?.navigationController?.pushViewController(nextVC, animated: true)
            })
            .disposed(by: disposeBag)
    }
}

위의 코드에서는 inputData라는 Variable을 생성하여 textField.rx.text를 바인딩하여 입력한 데이터를 저장하고, 다음 화면으로 전달합니다. 전환되는 화면에서는 전달받은 데이터를 사용할 수 있습니다.

4. 화면 전환 후 결과 받기

일부 화면 전환이 완료된 후에 결과를 받고 싶은 경우도 있습니다. RxCocoa의 Driver를 이용하여 비동기 작업을 처리하면 화면 전환 후 결과를 받을 수 있습니다. 아래의 예제 코드는 화면 전환 후 결과를 받는 기능을 구현한 예입니다.

class ViewController: UIViewController {
    @IBOutlet weak var nextButton: UIButton!

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        nextButton.rx.tap
            .flatMapLatest { [weak self] _ -> Observable<Bool> in
                let nextVC = NextViewController()
                self?.navigationController?.pushViewController(nextVC, animated: true)
                return nextVC.resultData.asObservable()
            }
            .subscribe(onNext: { result in
                // 결과를 처리하는 코드
            })
            .disposed(by: disposeBag)
    }
}

위의 코드에서는 flatMapLatest 연산자를 사용하여 화면 전환 후의 비동기 작업을 처리하고, 전환된 화면의 결과를 구독하여 처리하는 코드를 작성했습니다.

결론

RxCocoa를 사용하면 iOS 앱에서 화면 전환을 더욱 간편하고 유연하게 처리할 수 있습니다. 이 글에서는 RxCocoa를 활용하여 화면 전환을 어떻게 처리하는지에 대해 알아보았습니다. 추가적인 정보는 RxSwift 공식 문서를 참고하시기 바랍니다.