2017-10-19 9 views
0

MVVM 아키텍처를 사용하고 있으며보기가 매우 복잡하므로보기를 별도의 클래스로 분할 한 다음 각각의 분리 된 뷰 모델을 사용하기로했습니다. 구성 요소를 볼 수 있습니다. 또한 코디네이터 (MVVMC는 기본적으로)를 사용하고 있습니다. 코디네이터를 사용하여 내 View Controller를 설정 한 다음 뷰 모델을 만들어 내보기의 IBOutlets를 통해 액세스 할 수있는 별도의보기 구성 요소에 주입합니다.MVVM을 복잡한 모델 구조로 사용하기

내 문제는 내가 CoreData를 사용하고 있고 여러 관계가있는 단일 NSManagedObject를 저장하려고하지만 관계 모델은 별도 뷰 구성 요소에 연결된 다른 뷰 모델에서만 사용할 수 있습니다. 내 기본보기에서 저장 단추를 누를 때 내 ViewController에서 소유 한 기본보기 모델에 다른보기 모델의 관계 모델을 제공 할 수있는 명확한 방법이 있습니까? 또는 다른 단추를 저장 단추를 도청 내 다른보기 모델 말할 아마 위임 패턴을 사용하여 생각해야합니까?

답변

1

그래서 나는 여러 가지 가능성이 있다고 생각합니다. 다음은 거의 비슷한 상황을 관리하는 방법입니다. 귀하의 생각에 도움이되기를 바랍니다.

먼저 내 Viewmodels 용 프로토콜을 만듭니다. 예 :

protocol Child1ViewProtocol { 
    func getFirstName() -> String 
} 

protocol Child2ViewProtocol { 
    func getLastName() -> String 
} 

protocol MainViewProtocol { 
    func getChildModel1() -> Child1ViewProtocol 
    func getChildModel2() -> Child2ViewProtocol 
    func getLanguage() -> String 
    func saveButtonPressed() 
} 

그런 다음 ViewModel 클래스를 만듭니다. 여기 아주 쉽게, 아이위한 것입니다 : 내가 그들에 액세스 할 수 있도록 기능이 saveButtonPressed은 당신이 당신의 MainViewModel를 만들 때 의미

class MainViewModel: MainViewProtocol { 
    var user: User? 
    var child1ViewModel: Child1ViewProtocol! 
    var child2ViewModel: Child2ViewProtocol! 

    init(child1ViewModel: Child1ViewProtocol, 
     child2ViewModel: Child2ViewProtocol) { 
     self.child1ViewModel = child1ViewModel 
     self.child2ViewModel = child2ViewModel 
    } 
    func getChildModel1() -> Child1ViewProtocol { 
     return self.child1ViewModel 
    } 

    func getChildModel2() -> Child2ViewProtocol { 
     return self.child2ViewModel 
    } 

    func getLanguage() -> String { 
     return self.user?.language ?? "" 
    } 

    func saveButtonPressed() { 
     self.user?.firstName = self.child1ViewModel.getFirstName() 
     self.user?.lastName = self.child2ViewModel.getLastName() 
     // And save the user for example 
    } 
} 

를 호출 할 때 자식 모델을 유지

class Child1ViewModel: Child1ViewProtocol { 
    var firstName: String? 
    init(firstName: String?) { 
     self.firstName = firstName 
    } 
    func getFirstName() -> String { 
     return self.firstName ?? "" 
    } 
} 

class Child2ViewModel: Child2ViewProtocol { 
    var lastName: String? 
    init(lastName: String?) { 
     self.lastName = lastName 
    } 
    func getLastName() -> String { 
     return self.lastName ?? "" 
    } 
} 

그리고 내 MainViewModel 코디네이터에서 childViewModels도 만들고 MainViewModel에 삽입해야합니다. 즉,보기에서 childViewModels에 대한 강력한 참조가 필요하지 않다는 의미입니다.