iOS 簡單的MVVM + RAC

簡單的嘗試一下MVVM + RAC 休雌,這個東西用過的都說好址芯。 VC 控制在200行不是夢哥捕。 啟動的VC不用管要销,直接點擊屏幕進第二個控制器就好
https://git.oschina.net/wyChirs/MVVM-RAC.git

MVVM.gif
1.先創(chuàng)建好VC ViewModel View 各自的類

我把UITableView 頁抽出來构回,自定義了一個。外加一個HeadView疏咐。主要完成數(shù)據(jù)的綁定纤掸,加載,更新(MJRefresh)

在UITableView的初始化方法中 設(shè)置代理浑塞,上下拉刷新等

-(instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style{
    self = [super initWithFrame:frame style:style];
    
    if (self) {
        self.dataArray = [NSMutableArray array];
        self.page      = 1;
        self.delegate  = self;
        self.dataSource = self;
        self.tableHeaderView = self.headView;
        
        self.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)];
        self.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
        self.mj_footer.automaticallyHidden = YES;  
    }
    return self;
}

上下拉刷新的方法(控制分頁)

-(void)refresh{
   self.page = 1;
  //該方法是執(zhí)行  refreshCommand 事件   @[self,@(self.page)]  傳遞的參數(shù)  執(zhí)行該方法后  會觸發(fā)VM 的 refreshCommand  事件借跪, 并且在取得參數(shù)時是按照數(shù)組下標(biāo)對應(yīng)獲取   
   [self.viewModel.refreshCommand execute:@[self,@(self.page)]];
}
-(void)loadMoreData{
   self.page++;
   [self.viewModel.refreshCommand execute:@[self,@(self.page)]];
}

在自定義的TableView中 Cell 的點擊事件


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
   // 執(zhí)行 itemClickCommand   傳入?yún)?shù) 
    [self.viewModel.itemClickCommand execute:@[[NSNumber numberWithInteger:indexPath.row],self.headView]];
}
2.最主要的就是 VM的創(chuàng)建

首先確定VM 需要做哪幾件事情 :

  • 1 網(wǎng)絡(luò)請求 數(shù)據(jù)更新
  • 2 處理UItableviewCell 的點擊事件

聲明兩個處理事件的對象

/** cell 點擊事件 */
@property(nonatomic,strong)RACCommand *itemClickCommand;
/** 刷新數(shù)據(jù) */
@property(nonatomic,strong)RACCommand *refreshCommand;
//RACCommand RAC中用于處理事件的類,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞酌壕,包裝到這個類中掏愁,他可以很方便的監(jiān)控事件的執(zhí)行過程。

聲明 數(shù)據(jù)源和分頁

@property(nonatomic,strong)NSMutableArray *data;
@property(nonatomic,assign)NSInteger page;

初始化事件 并綁定數(shù)據(jù)

-(void)initViewModel{
    
    @weakify(self);
    
    self.refreshCommand  =  [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        @strongify(self)
        //此處  網(wǎng)絡(luò)請求獲取數(shù)據(jù)源  上下拉刷新更新數(shù)據(jù)源
        self.page = [input[1] integerValue];

        if (self.page == 1) {
            [self.data removeAllObjects];
        }
        
        for (NSInteger i = 0; i< 5; i++) {
            
            NSDictionary *dic = @{@"name":[NSString stringWithFormat:@"第%ld頁怪獸",self.page],@"age":@(i+20)};
            Model  *mod = [[Model alloc] initWithDictionary:dic];
            
            [self.data addObject:mod];
        }
        
        TableView *tableView = input[0];
        [tableView reloadData];
        
        [tableView.mj_header endRefreshing];
        [tableView.mj_footer endRefreshing];
        
        return [RACSignal empty];
    }];
    
    self.itemClickCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        @strongify(self)
        
        HeadView * view  = input[1];
        
        NSInteger index  =  [input[0] integerValue];
        Model *mod = self.data[index];
        
        view.bgLabel.text = [NSString stringWithFormat:@"--%@:  %ld歲--",mod.name,mod.age];
        
        return [RACSignal empty];
    }];  
![MVVM.gif](http://upload-images.jianshu.io/upload_images/1711499-b8eeebb6add0a61d.gif)
}

最后就是在VC中 綁定VM

//最后的VC 僅僅只有50行代碼 所有的業(yè)務(wù)邏輯卵牍,網(wǎng)絡(luò)請求都已經(jīng)放在了VM中進行果港。
@interface TestViewController ()

@property(nonatomic,strong) TableView *tableView;
@property(nonatomic,strong) ViewModel *viewModel;

@end

@implementation TestViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.viewModel = [ViewModel new];
    
    [self bindViewModel];
    
    [self.view addSubview:self.tableView];
    
}

-(void)bindViewModel{
    
    //KVO 形式  動態(tài)監(jiān)測 數(shù)組和 頁數(shù)
    RAC(self.tableView,dataArray) = RACObserve(self.viewModel, self.data);
    RAC(self.tableView,page)      = RACObserve(self.viewModel, self.page);
    
    [self.viewModel.refreshCommand execute:@[self.tableView,@(1)]];
}

-(TableView*)tableView{

    if (!_tableView) {
        _tableView = [[TableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
        
        _tableView.viewModel = self.viewModel;
        
    }
    return _tableView;
}

隨便看了一點別人的demo和資料,深點的還不太懂糊昙, 很多類還沒有嘗過辛掠,需要多多嘗試。

參考鏈接:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溅蛉,一起剝皮案震驚了整個濱河市公浪,隨后出現(xiàn)的幾起案子他宛,更是在濱河造成了極大的恐慌,老刑警劉巖欠气,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厅各,死亡現(xiàn)場離奇詭異,居然都是意外死亡预柒,警方通過查閱死者的電腦和手機队塘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宜鸯,“玉大人憔古,你說我怎么就攤上這事×苄洌” “怎么了鸿市?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長即碗。 經(jīng)常有香客問我焰情,道長,這世上最難降的妖魔是什么剥懒? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任内舟,我火速辦了婚禮,結(jié)果婚禮上初橘,老公的妹妹穿的比我還像新娘验游。我一直安慰自己,他們只是感情好保檐,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布耕蝉。 她就那樣靜靜地躺著,像睡著了一般展东。 火紅的嫁衣襯著肌膚如雪赔硫。 梳的紋絲不亂的頭發(fā)上炒俱,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天盐肃,我揣著相機與錄音,去河邊找鬼权悟。 笑死砸王,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的峦阁。 我是一名探鬼主播谦铃,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼榔昔!你這毒婦竟也來了驹闰?” 一聲冷哼從身側(cè)響起瘪菌,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘹朗,沒想到半個月后师妙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屹培,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年默穴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褪秀。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓄诽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媒吗,到底是詐尸還是另有隱情仑氛,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布闸英,位于F島的核電站调衰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏自阱。R本人自食惡果不足惜嚎莉,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沛豌。 院中可真熱鬧趋箩,春花似錦、人聲如沸加派。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芍锦。三九已至竹勉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娄琉,已是汗流浹背次乓。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孽水,地道東北人票腰。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像女气,于是被迫代替她去往敵國和親杏慰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容