본문 바로가기
Swift 개발 이야기

RxSwift를 활용하여 이전 뷰컨트롤러에 데이터 전송하기

by 방화동한량 2018. 4. 26.
728x90

번거로운 Delegate 를 사용하지 않고도 안전하게 이전 뷰컨트롤러로 데이터를 전송하는 법을 알아보도록 하겠읍니다.


먼저 데이터를 받을 테이블뷰컨트롤러를 생성하고 뿌려줄 데이터를 저장할 어레이를  만들어줍니다.


    let disposeBag = DisposeBag()

    let stringArray = Variable<[String]>([])

    let tableView = UITableView()



이후 스트링어레이와 테이블뷰를 바인딩해줍니다.


        stringArray.asObservable().bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)){

            row, data, cell in

            cell.textLabel?.text = data

            

        }.disposed(by: disposeBag)



1차적인 작업이 끝났으니, 입력창으로 넘어갑니다. 이 뷰컨트롤러는 NextViewController 로 설정해줍니다.


데이터를 입력할 텍스트필드와 Observable 을 설정해줍니다. 최근 값만 확인할 것이기 때문에 PublishSubject 로 설정하겠읍니다.


    let scTextField = UITextField()

    let observeText = PublishSubject<String>()

    let backBtn = UIButton()

    var sendString = ""


뒤로 이동할 버튼과, 버튼 이동 시에 전달할 변수도 지정해 줍니다.


    @objc func backTouched() {

        self.navigationController?.popViewController(animated: true)

        self.sendString = scTextField.text ?? ""

        observeText.onNext(sendString)

    }


뒤로 넘어갈 때 scTextField에 있는 값을 observeText 에 추가해줍니다.


이제 NextViewController 에서 할 일은 모두 완료되었습니다.


다시 최초 뷰컨트롤러로 돌아갑니다.


NextViewController 로 이동할때 버튼 액션을 설정합니다.


        let vc = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController

        

        vc.observeText.asObservable().filter({!(($0.isEmpty))}).distinctUntilChanged({$0 == $1}).debounce(1, scheduler: MainScheduler.instance).subscribe(onNext: { (text) in

            self.stringArray.value.append(text)

            print(self.stringArray.value)

        }, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)

        self.navigationController?.pushViewController(vc, animated: true)


filter 옵션으로 공백은 포함되지 않으며, distinctUntilChanged 로 동일한 명칭은 제외하고 구독을 하게 설정하였읍니다.

다음 뷰로 넘어가는 버튼에 해당 함수를 추가하였기 때문에, 버튼을 누르면서 구독이 시작되며 다음 뷰에서 일어나는 현상을 관찰합니다.

그리고 NextViewController 에서 뒤로가기 버튼을 누르면, sendString 값을 observeText 의 구독값으로 설정하고, 변화를 감지한 최초 뷰컨트롤러에서 클로저 내의 작업을 실행하여 stringArray 에 값을 추가하게 됩니다.