#####前言 继续前几天的工作,这次主要是搭建聊天页面。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实现即时通讯了,一定又是各种毛病,顺利不了,继续加油吧。。。