이 저장소는 소비가 아닌 데모 목적으로 만들어졌습니다. 그러나이 저장소의 피드백과 사용을 감안할 때 여기에서 유지 관리를 시작하고 제기 된 문제를 고정/구현하기 시작합니다.
MVVM ? Apple이 추천하는 MVC가 아닌 이유는 무엇입니까? 안드로이드 MVP가 잘 맞습니까? 멋진 바이퍼 패턴은 어떻습니까? 나는 각 패턴이 테이블에 무엇을 가져 오는지 설명하기 위해 이미 큰 노력을 기울 였다고 생각합니다. 따라서 여기서 아이디어는 토론에 추가하는 것이 아니라 내가 이미 형성 한 의견을 넘어서는 것입니다. MVVM은 갈 길입니다.
MVVM이 무엇인지에 대한 빠른 프라이머로서, ViewModel은 데이터 제공 모델 과 뷰 사이를 중재하는 설계 패턴입니다.

iOS에서 View는 본질적으로 ViewController 이며 ViewModel은 view render의 정확한 데이터를 제공하는 객체 (구조)입니다.
이것은 유지 관리 가능 (매우 얇은 뷰 컨트롤러) 및 테스트 가능한 느슨하게 결합 된 아키텍처를 제공합니다 (ViewModel은 UI를 초록하여 쉽게 테스트 할 수 있습니다).
고전적인 MVVM은 도메인 모델로 모델의 경우 쉽게 (그리고 아름답게) 단일 책임 원칙을 쉽게 허용합니다. 그러나 빈혈 모델 (일반적으로 REST API를 잘 작성한 경우)의 경우 데이터 및 탐색 흐름을 용이하게하는 다른 중재자 또는 발표자도 필요합니다.
이제 View Model은 사용자의 변경 사항에 관한 View에서 View를 업데이트 할 책임이 있습니다. 이는 양방향 데이터 바인딩을 사용하여 최소 코드로 달성 할 수 있습니다. 그러나… iOS는 상자에서 사용할 수있는 두 가지 방법 바인딩 메커니즘이 없습니다!
운 좋게도 우리는 RXSwift, RXCocoa 와 같은 반응 형 라이브러리를 가지고 있지만 양방향 바인딩이 반응성 프로그래밍 패러다임의 매우 작은 부분이라는 점을 고려하면 너무 무겁습니다. SimpleTwowayBinding은 간단한 방법으로 두 가지 방식의 바인딩을 제공하기 위해 노력합니다!
예제 프로젝트를 실행하려면 Repo를 복제하고 먼저 예제 디렉토리에서 pod install 실행하십시오.
import SimpleTwoWayBinding
struct FormViewModel {
let name : Observable < String > = Observable ( )
let companyName : Observable < String > = Observable ( )
let yearsOfExperience : Observable < Double > = Observable ( )
let isCurrentEmployer : Observable < Bool > = Observable ( false )
let approxSalary : Observable < Float > = Observable ( )
let comments : Observable < String > = Observable ( )
}보기에 "바인딩 가능한"속성은 관찰 가능한 것으로 선언되어야합니다.
class ViewController : UIViewController {
@ IBOutlet weak var nameField : UITextField !
@ IBOutlet weak var companyField : UITextField !
@ IBOutlet weak var isCurrentEmployerSwitch : UISwitch !
@ IBOutlet weak var yearsOfExperienceStepper : UIStepper !
@ IBOutlet weak var salaryRangeSlider : UISlider !
@ IBOutlet weak var selectedSalaryRangeLabel : UILabel !
@ IBOutlet weak var selectedYearsOfExperienceLabel : UILabel !
var viewModel : FormViewModel !
override func viewWillAppear ( _ animated : Bool ) {
super . viewWillAppear ( animated )
self . navigationItem . title = " Survey Form "
setupBindings ( )
}
func setupBindings ( ) {
nameField . bind ( with : viewModel . name )
companyField . bind ( with : viewModel . companyName )
isCurrentEmployerSwitch . bind ( with : viewModel . isCurrentEmployer )
yearsOfExperienceStepper . bind ( with : viewModel . yearsOfExperience )
salaryRangeSlider . bind ( with : viewModel . approxSalary )
selectedSalaryRangeLabel . observe ( for : viewModel . approxSalary ) {
[ unowned self ] ( _ ) in
self . selectedSalaryRangeLabel . text =
self . viewModel . getSalaryString ( )
}
selectedYearsOfExperienceLabel . observe ( for : viewModel . yearsOfExperience ) {
[ unowned self ] ( _ ) in
self . selectedYearsOfExperienceLabel . text =
self . viewModel . getExperienceString ( )
}
}
} UICONTROL의 bind 방법은 관찰 가능한 두 가지 방법 바인딩을 오케스트레이션합니다. 그것은 양식을 작동시키는 데 필요한 모든 코드입니다. 아래 스크린 샷을 참조하십시오.
SimpleTwowayBinding은 코코아포드를 통해 사용할 수 있습니다. 설치하려면 Podfile에 다음 줄을 추가하십시오.
pod 'SimpleTwoWayBinding' Manish Katoch, [email protected]
SimpleTwowayBinding은 MIT 라이센스로 제공됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.