最近集成融云,具体代码开发文档很清楚。讲讲问题点
问题来源:因为融云的头像和聊天回话列表的信息由开发者自己提供,当融云需要的时候去调起这个用户信息提供者。(用户提供者是个单例,设置一个就好)
这时候我陷入了一个误区,就是想着融云获取头像的时候根据userId调接口获得头像返回。可以实现结果但是存在很大的问题:
1.耗费资源,一个userId你就要请求一次。
2.容易造成堵塞,因为这个方法需要你请求完结果之后再返回数据。
最后想起了这个办法。因为融云的聊天列表都是你聊过的才显示。所以你在发起会话的时候根据你的userId缓存下该userId头像即可。
缓存机制很多字典形势把userid为key就可以。 NSUserDefaults,plist文件,sqlite都可以,根据项目需求
最后不要忘记在会话列表删除的时候,移除掉。
/**
*此方法中要提供给融云用户的信息,建议缓存到本地,然后改方法每次从您的缓存返回
*/
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void(^)(RCUserInfo* userInfo))completion
{
NSString * LoginId = [RCIMsharedRCIM].currentUserInfo.userId;
if ([userIdisEqualToString:LoginId]) {
RCUserInfo *user = [[RCUserInfoalloc]init];
user.userId = userId;
user.name = [[NSUserDefaultsstandardUserDefaults]objectForKey:USER_NAME];
user.portraitUri = [[NSUserDefaultsstandardUserDefaults]objectForKey:AVATAR_S];
return completion(user);
}else{
otherUser = [[RCUserInfoalloc]init];
otherUser.userId = userId;
otherUser.name = [[NSUserDefaultsstandardUserDefaults]objectForKey:[NSStringstringWithFormat:@"%@/name",userId]];
otherUser.portraitUri = [[NSUserDefaultsstandardUserDefaults]objectForKey:[NSStringstringWithFormat:@"%@/avatar",userId]];
return completion(otherUser);
}
}
- (void)didReceiveMessageNotification:(NSNotification *)notification {
[UIApplicationsharedApplication].applicationIconBadgeNumber =
[UIApplicationsharedApplication].applicationIconBadgeNumber +1;
if ([notification.objectisKindOfClass:[RCMessageclass]]) {
RCMessage * message = (RCMessage *)notification.object;
[selfgetUserBaseFromRemoteWith:message.targetId];
}
}
2、头像都缓存到本地了,换部手机就完蛋了。所以在显示列表之前检测下所有的userid信息是否都有缓存。如果没有的话你还需要从你服务器获得显示这个是没有办法的。
-(NSMutableArray *)willReloadTableData:(NSMutableArray *)dataSource{
NSMutableArray * array = [NSMutableArray array];
for (RCConversationModel * modelin dataSource) {
if ([[NSUserDefaultsstandardUserDefaults]objectForKey:model.targetId]==nil) {
[selfgetUserBaseFromRemoteWith:model.targetId];
}
[array addObject:model];
}
return array;
}
BUG:这样还是会有缺陷那就是换头像无法更新。