IM_ChatUIKit 之 ConversationViewController

#####前言 继续前几天的工作,这次主要是搭建聊天页面。RCConversationViewController用的是UICollectionView,而LCCKConversationViewController用的是UITableViewController,大同小异,本来想把ChatKit里面的UI和IM剥离,但是LCCKConversationViewController涉及的文件确实太多,光浏览MessageModel和各种Cell类型就够我受的了,而且和数据密切关联,实在不好分开,在经过了一天的努力之后,决定放弃。(:з」∠)


#####分析 本想着把所有关联数据的地方一律删除,可是远没想象中那么简单,虽说失败了,但还是有所收获。LCCKConversationViewController运用MVVM,base类一大堆,各种地方写的很好,井井有条。特别关注了一下消息时间的显示,发现各种cell上并无timeLabel相关,细细找了一下,原来是LCCKConversationViewModel里面有这么一个方法:-messagesWithSystemMessages:lastMessage:。 该方法能让preload时动态判断插入时间戳,同时也用在第一次加载时插入时间戳。通过这个方法把两条消息之间大于三分钟的插入一条时间戳作为系统消息显示。这一点倒是可以学习。

- (NSArray *)messagesWithSystemMessages:(NSArray *)messages lastMessage:(id)lastMessage {
    NSMutableArray *messageWithSystemMessages = lastMessage ? @[lastMessage].mutableCopy : @[].mutableCopy;
    for (id message in messages) {
        [messageWithSystemMessages addObject:message];
        [message lcck_shouldDisplayTimestampForMessages:messageWithSystemMessages callback:^(BOOL shouldDisplayTimestamp, NSTimeInterval messageTimestamp) {
            if (shouldDisplayTimestamp) {
                [messageWithSystemMessages insertObject:[LCCKMessage systemMessageWithTimestamp:messageTimestamp] atIndex:(messageWithSystemMessages.count - 1)];
            }
        }];
    }
    if (lastMessage) {
        [messageWithSystemMessages removeObjectAtIndex:0];
    }
    return [messageWithSystemMessages copy];
}
复制代码
// 是否显示时间轴Label
- (void)lcck_shouldDisplayTimestampForMessages:(NSArray *)messages callback:(LCCKShouldDisplayTimestampCallBack)callback {
    /* Set LCCKIsDebugging=1 in preprocessor macros under build settings to enable debugging.*/
#ifdef LCCKIsDebugging
    //如果定义了LCCKIsDebugging则执行从这里到#endif的代码
    return YES;
#endif
    BOOL containsMessage= [messages containsObject:self];
    if (!containsMessage) {
        return;
    }
    
    NSTimeInterval selfMessageTimestamp = [self lcck_messageTimestamp];
    
    NSUInteger index = [messages indexOfObject:self];
    if (index == 0) {
        !callback ?: callback(YES, selfMessageTimestamp);
        return;
    }
    id lastMessage = [messages objectAtIndex:index - 1];
    
    NSTimeInterval lastMessageTimestamp = [lastMessage lcck_messageTimestamp];
    NSTimeInterval interval = (selfMessageTimestamp - lastMessageTimestamp) / 1000;
    
    int limitInterval = 60 * 3;
    if (interval > limitInterval) {
        !callback ?: callback(YES, selfMessageTimestamp);
        return;
    }
    !callback ?: callback(NO, selfMessageTimestamp);
}
复制代码

#####步骤: 鉴于公司项目里的即时通讯没有ChatKit里面那么复杂,所已就没有弄很多的基类,直接一个ViewController开搞。 MessageModel:很简单的一个model,只有聊天数据,类型,时间,消息id等。类型也只有图片,文字,文件三种。 Cell:所以说我干脆写在一个文件里算了,也不分啥类型了,一个搞定。 剩下的就是写写布局神马的,没什么好说的。顺便运用了Chatkit里面消息时间显示的做法。很nice。


#####成品效果 弄了点假数据,UI也是比较粗糙,将就一下,有待优化。

#####后记 接下来的任务就是把项目里面的RCKit换成用RCLib+自己的UI实现即时通讯了,一定又是各种毛病,顺利不了,继续加油吧。。。

转载于:https://juejin.im/post/5a32187551882575cb741fb8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值