MVVM架構(gòu)的核心是View-Model,View-Model是一種特殊的Model,它代表了應(yīng)用UI的各種狀態(tài).
它包含了描述各種UI管理的狀態(tài)的屬性.例如一個TextField中當(dāng)前的text,一個button是否是enable狀態(tài).同時它也向外界提供當(dāng)前View可以執(zhí)行的action,例如button的點擊和手勢的觸發(fā).MVVM需要遵循以下規(guī)則
- View持有ViewModel,但是反過來不可以
- ViewModel持有Model,但是反過來不可以
- 這個模式最直接的好處如下:
- 輕量級的View --- 因為所有的UI邏輯都存在于ViewModel中,所以View會非常輕量級
- 測試 --- 可以再沒有不依賴View的情況下運(yùn)行程序,極大增強(qiáng)了可測試性
MVVM架構(gòu)依賴于數(shù)據(jù)綁定,并且是雙向的數(shù)據(jù)綁定,ViewModel的屬性發(fā)生了變化要傳遞給UI,UI上用戶輸入了變化也要傳遞給ViewModel.
UIButton的rac_command屬性跟RACCommand實例綁定后,可以控制UIButton的enable狀態(tài),同時,點擊UIButton的時候執(zhí)行該command(validSearchSignal傳遞YES的時候button可點擊,傳遞NO的時候Button不可點擊)
[[RACCommand alloc] initWithEnabled:validSearchSignal
signalBlock:^RACSignal *(id input) {
return [self executeSearchSignal];
}];
self.searchButton.rac_command = self.viewModel.executeSearch;
RACCommand的executing屬性可以用來判斷當(dāng)前的command是否正在執(zhí)行
not方法可以將RACSignal中傳遞的值取反
RACCommand的executionSignals屬性會把每次command執(zhí)行的時候創(chuàng)建的signal傳出來(如果command綁定的button,并且點擊button的時候需要做一些操作,可以用這個屬性)
[self.viewModel.executeSearch.executionSignals
subscribeNext:^(id x) {
[self.searchTextField resignFirstResponder];
}];
- The ViewModel exposes properties that represent the UI state, it also exposes commands — and often methods — that represent UI actions. It’s responsible for managing changes to the UI state based on user interactions.
However, it’s not responsible for the actual business logic that executes because of these interactions. That is the job of the Model. - MVVM結(jié)構(gòu)總結(jié)
1.model層提供服務(wù)和業(yè)務(wù)邏輯,在Flickr這個例子里,model層提供Flickr搜索照片的服務(wù)
- View-Model層代表了整個應(yīng)用UI的各種狀態(tài),同時它也對用戶交互和和來自Model層的事件進(jìn)行回應(yīng)(UI狀態(tài)的改變).
- View層功能非常簡單,它只提供View-Model層各種狀態(tài)的展示和用戶交互.