關於代碼風格的一些看法(二)

接上一篇文章說到使用ViewModel來瘦身ViewController,也就是把ViewController中有關原始數據適配到view須要的數據的一種辦法.
數組

- (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];
}

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

[self appendChatRoomMessage:message forceRefresh:YES];

把message傳給appendChatRoomMessage進行後續的處理,而上面的若干行代碼都是對message進行賦值,那最簡單的想法就是可否經過一個方法能夠直接獲取到message,有了這樣的想法,咱們會定義這樣的方法atom

+ (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裏面只須要寫spa

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

這樣就只要在VC裏寫兩句話,而構造message的細節都封裝在ViewModel裏..net

咱們可能有不少像onRoomInfoUpdateNotification這樣的回調,最終都要轉換成MFChatRoomMessage, 那既然這類notification的做用只是對數據進行處理,和UI並沒半毛錢關係,那就能夠直接把這些全都封裝到ViewModel裏.接下來再看下咱們的appendChatRoomMessage裏面到底要幹什麼code

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

把數據message加到一個數組,而後刷新UI,因此咱們最終的目的仍是刷UI,那實際上咱們的ViewController連msgArray都不須要了,只要持有ViewModel就能夠了orm

因此綜上所述,MyViewModel應該是相似這樣的blog

@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裏rem

@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

這裏就進行了近一步的封裝,把和數據msgArray的操做細節都封裝到了VM,VC徹底不用進行復雜的數據處理工做了.一樣的想法,若是一個VC裏面同一個table有不少Cell,也一樣能夠封裝進VM,而VC只關心最後獲得的cell,這樣作會減小VC的大小,而能夠更容易看明白VC的控制細節,而VM做爲一個數據的轉化工廠被VC持有,VC能夠方便的取出View須要的最終數據.get

相關文章
相關標籤/搜索