minuco
article thumbnail
Published 2023. 12. 5. 01:30
[TIL] MVVM(3) iOS/TIL

데이터 전달.

 

MVVM(1)과 MVVM(2)에서 공부한 건 Start 버튼(1번 손가락)을 눌렀을 때, 

빈 View에 데이터를 받아와 뿌려주는 과정이다.

 

그럼 Next버튼(2번 손가락)을 눌렀을 때 다음화면으로 받은 데이터를 넘겨줘야 한다.

정리하자면

 

1. start 버튼을 누른다(1번 손가락)

 

2. ViewModel에서 버튼이 눌린 걸 감지한 후 네트워크와 통신을 한 다음 성공하면,

데이터를 모델에 담은 후(변경이 된 후) didSet이 감지한다.

 

3. View에 있는 ViewModel의 인스턴스에서 didSet에 선언해 놓은 클로저를 호출하고

변경된 데이터를 가공해 놓은 View관련 변수를 호출하면 View가 변경된다.

 

4. Next 버튼을 누른다(2번 손가락)

5. 첫 번째 View에 ViewModel 인스턴스에는 데이터가 들어있다. 

어떤 데이터?  ViewModel 인스턴스 객체(인스턴스)에 그럼 이 데이터를 2번째 Vew에 옮겨줘야겠지?

 

6. 어떻게 옮길까?

    1) 우선 데이터는 ViewModel 인스턴스에 있으니까 이걸 두 번째 View로 넘겨줘야겠지?

 why??? 

 생각해 보면 첫 번째 View에서 ViewModel이 View가 바뀐걸 어떻게 감지했지? 첫 번째 View에 1번 손가락을 이용해 Start 버튼을 클릭하는 액션이 이루어졌지? 그럼 지금 2번 손가락으로 Next버튼을 눌러서 액션이 이루어졌지? 첫 번째 손가락을 누르고 난 흐름을 생각해 보면 지금 액션이 이루어진 것을 ViewModel에서 감지를 해 야해 어떻게? didSet+ 클로저감지를 했었잖아.(View에 있는 ViewModel인스턴스. 클로저로 감지했었지?)

 

그럼, 두 번째 View도 View에 있는 ViewModel인스턴스 + 클로저로 사용해 주면 되겠네?

아!? 그럼 , 첫 번째 View의 ViewModel의 데이터를 두 번째 View의 ViewModel에 데이터를 넘겨주면 되겠네??

 

class MusicViewModel {
...
    // 모델의 데이터를 DetailViewModel로 반환시켜주는 함수
    func getDetailViewModel() -> DetailViewModel {
        let detailVM = DetailViewModel()

        detailVM.music = self.music
        detailVM.imageURL = self.music?.imageUrl

        return detailVM
    }
...
}

class ViewController: UIViewController {

...

    @IBAction func nextButtonTapped(_ sender: UIButton) {

        guard viewModel.music != nil else { return }

        let detailVM = DetailViewModel()

        // 뷰모델에서 detailVM에 필요한 데이터를 넘겨준다.
        let detailVM = viewModel.getDetailViewModel()
        
        let detailVC = storyboard?.instantiateViewController(withIdentifier: "detailVC") as! DetailViewController
        
        // 두번째 View에 ViewModel을 전달해준다.
        detailVC.viewModel = detailVM
        
        // 두번째 View 인스턴스와 함깨 화면 전환을 해준다.
        detailVC.modalPresentationStyle = .fullScreen
        self.present(detailVC, animated: true)
    }
}

 

이와 같이 첫 번째 ViewModel에서 데이터를 모델에 담아 줬잖음? 이 담은 데이터를 두 번째 ViewModel 인스턴스를 만들어 데이터를 저장해 놓고 두 번째 ViewModel 타입으로 반환 함수를 만들어 놈

 

그 후 Next 버튼이 눌렸을 때 화면 전환을 하면서 이 데이터들을 넘겨주면 데이터는 다 넘어감. 

 

데이터가 뜨는 게 되는 과정은 담에... 

 

아직 작성 중...

'iOS > TIL' 카테고리의 다른 글

[TIL] Combine (1)  (1) 2024.01.30
[TIL] MVVM(2)  (0) 2023.11.28
[TIL] MVVM(1)  (2) 2023.11.25
[TIL] NaverMapAPI  (0) 2023.03.16
profile

minuco

@minuco

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!