MVVM模式初體驗(使用ReactiveCocoa獲取網(wǎng)絡(luò)數(shù)據(jù))

使用RAC也有一段時間了,由于此前的項目都是使用的MVC模式媳瞪,網(wǎng)絡(luò)請求都封裝在固定的模塊中抑片,抽取出來十分不方便,所以到目前為止并沒有涉及到使用RAC去做獲取網(wǎng)絡(luò)請求的情景硫惕。
近期茧痕,著手重構(gòu)目前手上的項目,準備給臃腫的Controller瘦身恼除,MVVM貌似是一個不錯的選擇(既然使用了RAC踪旷,那為什么不使用MVVM呢?)。于是豁辉,開始上手體驗MVVM模式和RAC的結(jié)合使用(RAC的基礎(chǔ)知識在這就不介紹了令野,百度一下,一大推老司機都有分享)徽级。不用不知道气破,一用才發(fā)現(xiàn)RAC和MVVM簡直是絕配啊,那體驗真是改變了我對編程的傳統(tǒng)觀念(函數(shù)響應(yīng)式編程真心好用)餐抢。
這里用一個小demo來舉例:
進入頁面加載數(shù)據(jù)顯示现使。這里使用我當前項目中的一個接口來模擬數(shù)據(jù)。既然是MVVM旷痕,那Model和ViewModel肯定是少不了的碳锈。如下:我們新建一個ViewModel叫LoadStoreViewModel(因為這里是加載商店數(shù)據(jù)),傳統(tǒng)的MVC模式中,網(wǎng)絡(luò)請求都是在ViewController中完成的欺抗,這里我們把網(wǎng)絡(luò)請求封裝到對應(yīng)的ViewModel中去殴胧,能夠有效的減少ViewController的負擔,降低耦合性。
LoadStoreViewModel主要有三個屬性:statues(網(wǎng)絡(luò)加載狀態(tài))团滥,code1(編號)竿屹,以及保存數(shù)據(jù)的數(shù)組dataArry,還有一個加載數(shù)據(jù)信號loadDataSignal灸姊;
初始化loadDataSignal:(主要進行網(wǎng)絡(luò)請求)

//
- (RACSignal *)loadDataSignal{
    if (_loadDataSignal==nil) {
        AFHTTPRequestOperationManager *manager=[AFHTTPRequestOperationManager manager];
        manager.requestSerializer=[[AFJSONRequestSerializer alloc]init];
        NSDictionary *params=@{@"code1":@"MWG08A09"};
        _loadDataSignal=[manager rac_GET:kLoadURL parameters:params];
    }
    return _loadDataSignal;
}

調(diào)用loadDataSignal處理網(wǎng)絡(luò)請求結(jié)果:


-(void)initWithSubscrible{
    [[self.loadDataSignal deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(RACTuple *jsonDataResult) {
        //請求成功拱燃,加載數(shù)據(jù)
        NSDictionary *tuple=[jsonDataResult objectAtIndex:0];
        NSArray *resultList=tuple[@"resultList"];
        if (resultList.count>0) {
            self.dataArray=[[[resultList.rac_sequence
                              map:^id(NSDictionary *dataSource) {
                              NSDictionary *dic=[(NSDictionary *)dataSource mutableCopy];
                                  WGStoreModel *model=[WGStoreModel mj_objectWithKeyValues:dic];
                                  return model;
                            }] array] mutableCopy];
        }
    }];
    
    //請求失敗
    [self.loadDataSignal subscribeError:^(NSError *error) {
       self.statues=@"沒有網(wǎng)絡(luò),哈哈";
    }];
}

ViewModel的操作完成力惯,接下來要在Controller中綁定ViewModel
綁定ViewModel碗誉,初始化,然后監(jiān)聽ViewModel中的網(wǎng)絡(luò)請求狀態(tài)父晶,獲得ViewMode中網(wǎng)絡(luò)請求結(jié)果哮缺,在Controller中給出相應(yīng)的提示,數(shù)據(jù)加載成功甲喝,顯示數(shù)據(jù)刷新控件:

-(void)bindViewModel{
    @weakify(self);
    self.storeViewModel=[[LoadStoreViewModel alloc]init];
    self.isLoading=YES;
    self.code1=kCode1;
    RAC(self.storeViewModel,code1)=RACObserve(self, code1);
    
    //加載狀態(tài)
   [RACObserve(self, isLoading) subscribeNext:^(id x) {
        UIApplication.sharedApplication.networkActivityIndicatorVisible = [x boolValue];
   }];
    
    //加載網(wǎng)絡(luò)數(shù)據(jù)成功
    [[[RACObserve(self.storeViewModel, dataArray) ignore:nil] doNext:^(id x) {
        self.isLoading=YES;
    }] subscribeNext:^(id x) {
        @strongify(self);
        self.isLoading=NO;
        //刷新控件--
        [self.tableView reloadData];
    }];
    
    //加載網(wǎng)絡(luò)數(shù)據(jù)失敗
    [[RACObserve(self.storeViewModel, statues) filter:^BOOL(id value) {
        //filter是過濾
        return value !=nil;
    }] subscribeNext:^(NSString *str) {
        UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"提示" message:str delegate:self cancelButtonTitle:@"confirm" otherButtonTitles:nil, nil];
        [alertView show];
    }];
    
}

ViewController中初始化TableView尝苇;

- (UITableView *)tableView{
    if (!_tableView) {
        _tableView=[[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain];
        _tableView.delegate=self;
        _tableView.dataSource=self;
        _tableView.showsVerticalScrollIndicator=NO;
        _tableView.rowHeight=49;
    }
    return _tableView;
}

tableView的數(shù)據(jù)源和協(xié)議方法實現(xiàn)

#pragma mark -tableView DataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [self.storeViewModel.dataArray count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *indefier=@"CELL";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:indefier];
    if (!cell) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:indefier];;
    }
    WGStoreModel *model=self.storeViewModel.dataArray[indexPath.row];
    cell.textLabel.text=model.shopName;
    
    return cell;
}

無demo不文章,為了更好的理解本篇文章埠胖,請到我的github下載對應(yīng)的demo糠溜,一運行探究竟(https://github.com/voidxin/ReactiveCocoaRequestData)
謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末直撤,一起剝皮案震驚了整個濱河市非竿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谋竖,老刑警劉巖红柱,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓖乘,居然都是意外死亡锤悄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門驱敲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铁蹈,“玉大人,你說我怎么就攤上這事众眨∥漳粒” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵娩梨,是天一觀的道長沿腰。 經(jīng)常有香客問我,道長狈定,這世上最難降的妖魔是什么颂龙? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任习蓬,我火速辦了婚禮,結(jié)果婚禮上措嵌,老公的妹妹穿的比我還像新娘躲叼。我一直安慰自己,他們只是感情好企巢,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布枫慷。 她就那樣靜靜地躺著,像睡著了一般浪规。 火紅的嫁衣襯著肌膚如雪或听。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天笋婿,我揣著相機與錄音誉裆,去河邊找鬼。 笑死缸濒,一個胖子當著我的面吹牛足丢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绍填,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼霎桅,長吁一口氣:“原來是場噩夢啊……” “哼栖疑!你這毒婦竟也來了讨永?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤遇革,失蹤者是張志新(化名)和其女友劉穎卿闹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝快,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡锻霎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揪漩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旋恼。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奄容,靈堂內(nèi)的尸體忽然破棺而出冰更,到底是詐尸還是另有隱情,我是刑警寧澤昂勒,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布蜀细,位于F島的核電站,受9級特大地震影響戈盈,放射性物質(zhì)發(fā)生泄漏奠衔。R本人自食惡果不足惜谆刨,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望归斤。 院中可真熱鬧痊夭,春花似錦、人聲如沸脏里。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膝宁。三九已至鸦难,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間员淫,已是汗流浹背合蔽。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留介返,地道東北人拴事。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像圣蝎,于是被迫代替她去往敵國和親刃宵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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