티스토리 뷰

iOS & swift

[RxSwift] dismiss 될 때 data 전달

ggasoon2 2021. 12. 15. 23:09

 

modal 형태의 secondVC에서 값을 받아 dismiss 될 때,

firstVC에서 secondVC의 data를 사용하는 방법입니다. (RxSwift 를 사용하여..)

 

 

예제로 만들어서 설명하겠습니다.

 

secondVC에만 존재하는 jh 라는 데이터를 firstVC로 넘겨주고 싶어요.

 

그럼 이렇게 가능 합니다.

 

1. secondVC에서 dismiss되기 전 넘겨주고 싶은 데이터를

secondVC에 존재하는 서브젝트(secondVC의 viewModel) 쏴주기

 

2. firstVC의 prepare에서 secondVC에 존재하는 Subject(secondVC의 viewModel)를 

구독하여 데이터 넘겨 받기

 

 

우선 첫번째 VC입니다. 이렇게 생겼어요. 

firstVC

 

 

모달띄우기 버튼을 누르면 secondVC가 modal 형태로 등장합니다.

 

 

secondVC

 

 

(이렇게..)

 

 

그러면 이제 secondVC에서는 버튼을 누르면 dismiss 되면서 값을 전달 하면 되겠죠?

 

 

secondVC

 

우선은 viewModel 타입 변수를 생성해 준 뒤, button을 tap 했을 때 save 함수를 실행해줬습니다.

 

save 함수는

dismiss 하면서, dismiss의 completion handler로 보내주고자 하는 'jh' 데이터를

subject로 emit 시켜줍니다. ( viewModel.person.onNext: person2 )

 

그리고 completed 시켜 메모리릭을 방지해줍니다.

 

 

viewModel은 person이라는 model 타입 subject가 존재합니다.

 

 

Model은 이런 형태입니다.

 

그럼 이제 dismiss의 completion handler에 전달되어 오는 data를 어떻게 받냐.

 

firstVC의 prepare로 갑니다.

 

firstVC

 

secondVC의 viewModel.person을 subcribe합니다.

subscribe 내용에 가져온 데이터를 사용할 로직을 작성해주면 됩니다.

저는 label에 뿌려줬어요.

 

 

그럼 이렇게 이제 

 

dismiss된 뒤 firstVC

 

dismiss 된 뒤 firstVC에서, secondVC로 부터 가져온 'jh' 가 잘 나오는 모습입니다.

 

 

 

프로젝트의 소스코드는 github에 공유해두겠습니다.

https://github.com/JangJaeHyung1/DismissPassingDataRx

 

 

 

아 그리고 secondVC에서 weak self 와 unowned self 를 둘 다 사용하였는데,

 

 

 

둘의 차이점도 작성하겠습니다.

 

우선 weak, unowned 쓰는 이유는

escaping clouser 내부에서 사용되는 모습이 많은데 ARC 때문입니다.

escaping clouser에서 서로 참조를 하고 있어, clouser가 끝나도 메모리 counting이 줄어들지 않는 문제가 발생합니다.

그래서 weak 과 unowned로 서로 참조하는 고리를 끊어주면 메모리누수를 방지할 수 있습니다.

 

그래서

self가 붙는 요소가 먼저 사라지는 경우엔 weak을,

self가 붙는 요소가 늦게 사라지거나 안사라지는 경우에 unowned를 사용하는것 같습니다. 

 

간단하게는

weak : self 가 붙는 요소가 nil이 될 수 있으면 

unowned : self가 붙는 요소가 nil이 아닐 경우

 

 

예를 들면

이 글에도 해당 프로젝트의 github 주소를 첨부했고,

해당 github의 readme 에도 이 블로그 글의 주소를 첨부하였습니다.

 

서로 참조하고 있어 한쪽이 없어져도 메모리 counting이 계속 남아있게 됩니다. (ARC 때문)

그래서 그 고리를 약하게 해줍니다.

둘다 nil이 될 수 있는 경우(글 삭제)이므로 어느쪽(github,tistory)이 self가 붙든 둘 다 weak을 붙여주겠죠?

 

 

 

 

 

 

 

추가적으로

ARC와 weak unowned 관련해서 읽어보시면 도움이 되실 것 같습니다.

 

ARC / Strong Reference Cycle 해결 방법(weak, unowned) (제디오스님)

https://zeddios.tistory.com/1213

 

weak와 unowned 사용 방법 (민소네님)

http://minsone.github.io/mac/ios/rules-of-weak-and-unowned-in-swift 

 

 

 

 

감사합니다:)

 

 

댓글