關(guān)于代碼風(fēng)格的一些見解(二)

接上一篇文章
說到使用ViewModel來瘦身ViewController,也就是把ViewController中有關(guān)原始數(shù)據(jù)適配到view需要的數(shù)據(jù)的一種辦法.

- (void)onRoomInfoUpdateNotification:(NSNotification*)notification
{
    MFChatRoomMessage* message = [[MFChatRoomMessage alloc] init];
    message.msgType = kSystemType;
    message.msgSubType = kPlanTextSubType;
     
    MFRoomInfo* roomInfo = [[MFAppModel  sharedObject].chatroomModelEx getCurrentRoomInfo];
    NSNumber* isLock = [[notification userInfo] objectForKey:KChatRoomIsLockChangeKey];
    NSNumber* isTopicChange = [[notification userInfo] objectForKey:KChatRoomIsTopicChangeKey];
    if (isLock.unsignedIntegerValue == 1) {
        message.msgText = (roomInfo.locked ? @"房主將房間鎖定" : @"房主將房間解鎖了");
    } else if (isTopicChange.unsignedIntegerValue == 1) {
        message.msgText = [NSString stringWithFormat:@"房主更改了話題 %@", roomInfo.subject];
    } else {
        message.msgText = @"房主更改了房間信息";
    }
     
    [self appendChatRoomMessage:message forceRefresh:YES];
}

截取上面一段代碼僅供參考說明,這段代碼實際上就干了一件事:

[self appendChatRoomMessage:message forceRefresh:YES];

message傳給appendChatRoomMessage進行后續(xù)的處理,而上面的若干行代碼都是對message進行賦值,那最簡單的想法就是能否通過一個方法可以直接獲取到message,有了這樣的想法,我們會定義這樣的方法

+ (MFChatRoomMessage *)getChatRoomMessage:(NSNotification*)notification msgType:(MFChatRoomMsgType)msgType msgSubType:(MFChatRoomMsgSubType)msgSubType {
  MFChatRoomMessage* message = [[MFChatRoomMessage alloc] init];
    message.msgType = kSystemType;
    message.msgSubType = kPlanTextSubType;
     
    MFRoomInfo* roomInfo = [[MFAppModel  sharedObject].chatroomModelEx getCurrentRoomInfo];
    NSNumber* isLock = [[notification userInfo] objectForKey:KChatRoomIsLockChangeKey];
    NSNumber* isTopicChange = [[notification userInfo] objectForKey:KChatRoomIsTopicChangeKey];
    if (isLock.unsignedIntegerValue == 1) {
        message.msgText = (roomInfo.locked ? @"房主將房間鎖定" : @"房主將房間解鎖了");
    } else if (isTopicChange.unsignedIntegerValue == 1) {
        message.msgText = [NSString stringWithFormat:@"房主更改了話題 %@", roomInfo.subject];
    } else {
        message.msgText = @"房主更改了房間信息";
    }
    return message;
}

那接下來ViewController里面只需要寫

- (void)onRoomInfoUpdateNotification:(NSNotification*)notification
{
   MFChatRoomMessage* message = [MyViewModel getChatRoomMessage:notification msgType:kSystemType msgSubType:kPlanTextSubType];
   [self appendChatRoomMessage:message forceRefresh:YES];
}

這樣就只要在VC里寫兩句話,而構(gòu)造message的細節(jié)都封裝在ViewModel里.

我們可能有很多像onRoomInfoUpdateNotification這樣的回調(diào),最終都要轉(zhuǎn)換成MFChatRoomMessage, 那既然這類notification的作用只是對數(shù)據(jù)進行處理,和UI并沒半毛錢關(guān)系,那就可以直接把這些全都封裝到ViewModel里.接下來再看下我們的appendChatRoomMessage里面到底要干什么

- (void)appendChatRoomMessage:(MFChatRoomMessage *)message forceRefresh:(BOOL)forceRefresh
{
    [_msgArray addObject:message];
     
    if (_msgArray.count > 50) {
        [_msgArray removeObjectAtIndex:0];
    }
     
    if (forceRefresh) {
        [self reloadAllMessage];
        return;
    }
}

把數(shù)據(jù)message加到一個數(shù)組,然后刷新UI,所以我們最終的目的還是刷UI,那實際上我們的ViewControllermsgArray都不需要了,只要持有ViewModel就可以了

所以綜上所述,MyViewModel應(yīng)該是類似這樣的

@interface MyViewModel : NSObject
 
@property (nonatomic, strong) NSMutableArray *msgArray;
- (void)addChatRoomMessage:(NSNotification*)notification msgType:(MFChatRoomMsgType)msgType msgSubType:(MFChatRoomMsgSubType)msgSubType;
 
@end
@implementation
- (NSMutableArray *)msgArray {
    if(_msgArray == nil) {
        _msgArray = [NSMutableArray array];    
    }
    return _msgArray;
}
 
- (MFChatRoomMessage *)getChatRoomMessage:(NSNotification*)notification msgType:(MFChatRoomMsgType)msgType msgSubType:(MFChatRoomMsgSubType)msgSubType {
  MFChatRoomMessage* message = [[MFChatRoomMessage alloc] init];
    message.msgType = kSystemType;
    message.msgSubType = kPlanTextSubType;
     
    MFRoomInfo* roomInfo = [[MFAppModel  sharedObject].chatroomModelEx getCurrentRoomInfo];
    NSNumber* isLock = [[notification userInfo] objectForKey:KChatRoomIsLockChangeKey];
    NSNumber* isTopicChange = [[notification userInfo] objectForKey:KChatRoomIsTopicChangeKey];
    if (isLock.unsignedIntegerValue == 1) {
        message.msgText = (roomInfo.locked ? @"房主將房間鎖定" : @"房主將房間解鎖了");
    } else if (isTopicChange.unsignedIntegerValue == 1) {
        message.msgText = [NSString stringWithFormat:@"房主更改了話題 %@", roomInfo.subject];
    } else {
        message.msgText = @"房主更改了房間信息";
    }
    return message;
}
- (void)addChatRoomMessage:(NSNotification*)notification msgType:(MFChatRoomMsgType)msgType msgSubType:(MFChatRoomMsgSubType)msgSubType {
   MFChatRoomMessage * message = [self getChatRoomMessage:notification msgType:msgType msgSubType:msgSubType];
   [self.msgArray addObject:message];
}
@end

然后在MyViewController

@interface MyViewController : UIViewController 
 
@property (nonatomic, strong) MyViewModel *viewModel;
 
@end
@implementation MyViewController
 
- (MyViewModel *)viewModel {
    if(_viewModel == nil) {
        _viewModel = [[MyViewModel alloc] init];
    }
    return _viewModel;
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    return self.viewModel.msgArray[indexPath.row];
}
- (void)onRoomInfoUpdateNotification:(NSNotification*)notification {
    [self.viewModel addChatRoomMessage:notification msgType:kSystemType msgSubType:kPlanTextSubType];
    [self.tableView reload];
}
@end

這里就進行了近一步的封裝,把和數(shù)據(jù)msgArray的操作細節(jié)都封裝到了VM,VC完全不用進行復(fù)雜的數(shù)據(jù)處理工作了.同樣的想法,如果一個VC里面同一個table有很多Cell,也同樣可以封裝進VM,而VC只關(guān)心最后得到的cell,這樣做會減少VC的大小,而可以更容易看明白VC的控制細節(jié),而VM作為一個數(shù)據(jù)的轉(zhuǎn)化工廠被VC持有,VC可以方便的取出View需要的最終數(shù)據(jù).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市站宗,隨后出現(xiàn)的幾起案子甲锡,更是在濱河造成了極大的恐慌爽室,老刑警劉巖闰蛔,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冬筒,居然都是意外死亡赘风,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門仁卷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穴翩,“玉大人,你說我怎么就攤上這事锦积∶⑴粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵丰介,是天一觀的道長背蟆。 經(jīng)常有香客問我鉴分,道長,這世上最難降的妖魔是什么带膀? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任志珍,我火速辦了婚禮,結(jié)果婚禮上垛叨,老公的妹妹穿的比我還像新娘伦糯。我一直安慰自己,他們只是感情好嗽元,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布敛纲。 她就那樣靜靜地躺著,像睡著了一般剂癌。 火紅的嫁衣襯著肌膚如雪淤翔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天佩谷,我揣著相機與錄音旁壮,去河邊找鬼。 笑死琳要,一個胖子當(dāng)著我的面吹牛寡具,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稚补,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼童叠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了课幕?” 一聲冷哼從身側(cè)響起厦坛,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乍惊,沒想到半個月后杜秸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡润绎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年撬碟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莉撇。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呢蛤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棍郎,到底是詐尸還是另有隱情其障,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布涂佃,位于F島的核電站励翼,受9級特大地震影響蜈敢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汽抚,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一抓狭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殊橙,春花似錦辐宾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽季研。三九已至敞葛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間与涡,已是汗流浹背惹谐。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驼卖,地道東北人氨肌。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像酌畜,于是被迫代替她去往敵國和親怎囚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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