본문 바로가기
Xcode/Swift - PlayGround

PlayGround) RxMvvm에서 Input과 Output에서 의문점

by 후르륵짭짭 2021. 9. 3.
728x90
반응형

 

회사에서 RxMvvm 구조로 개발을 하는데, 

그 때 ViewModel에서 Input 과 Output을 정의해서 View와 View Model의 의존 관계를 만들어 줍니다.

그 때 항상 의구심이 들었던 건데, Input과 Output을 struct 로 정의하는데, 어떻게 ViewModel과 View 간의 주소값이 

변경이 안되고 서로 값을 바꾸고 사용하는 건지 가지게 되는지 이해 하기 어려웠습니다.

그래서 아무 생각 없이 따라 썼는데, 그게 더 답답하더라구요,,,,

 

https://www.youtube.com/watch?v=Z6BApjb04Jw 

< J-Rock인데 노래가 좋아서 들고 왔습니다. >

 

** 결론 ** 

class ViewModel {

    struct Input {
        var askName : PublishSubject<String>
    }

    struct Output {
        var resultName : PublishSubject<String>
    }

    func declareInput() -> Input {
        return Input(askName: .init())
    }

    func declareOutput(input : Input) -> Output {

        let output = Output(resultName: .init())

        return output
    }

}

class ViewController {

	init(viewModel : ViewModel){
    	bind(viewModel)
    }
    
    private func bind(_ : ViewModel){
    
    	let input = viewModel.declareInput()
        let output = viewModel.declareOutput(input : input)

	}

}

대충 표현하면 이렇게 사용하는 것으로 배웠습니다.

그런데,,,, declareInput에서 나오는 값은 Struct이고 Struct는 Value Type이고 그럼 값만 받지,,,,

주소값은 안 받아질 것이고,,,,,, 근데,,, 어떻게 ViewController과 ViewModel이 서로 연결돼서 사용하는건지,,,,

 

정답은 바로 Observable에 있었습니다. PublishSubject , Observable 모두 Struct 구조가 아니라 Class 였습니다.

따라서 Struct로 만들어준 Input과 Ouput은 포장지이고 내부가 진짜였습니다.

// RXMvvm의 Input , Output 이 가능한 이유는 Struct 내부의 값이 모두 Class이기 때문에 가능한 것이다.
// 즉 감싸고 있는 것이 Struct 라도 내부가 주소값 이라면 원격으로 값 변동이 가능하다!
class F1 {

    var name : String

    init(name : String){
        self.name = name
    }

}

class ViewModel {

    struct Input {
        var f1 : F1
    }

    struct Output {
        var resultName : String
    }

    func declareInput() -> Input {
        return Input(f1: F1.init(name: "Hello"))
    }

    func declareOutput(input : Input) -> Output {

        let output = Output(resultName: "world")

        input.f1.name = "world hello"

        return output
    }

}


let vm = ViewModel()

var input = vm.declareInput()

input.f1.name // "Hello"

vm.declareOutput(input: input)

input.f1.name // "world hello"

 

728x90
반응형

댓글