데이터 전달.
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 |