byzqk

新版,加入连麦功能,直播的流程修改很多,每次登录都需要登录liveroom组件

期间遇到一个奇葩的问题,就是游客登录组件之后,切换为用户登录,出现im消息重复的问题,一开始以为是游客退出不成功,导致的问题,然后一直找这个问题,确定游客百分之百退出了。。。以为该好了,可是。。。。效果,依然是那种情况,并无卵用,然后,开始了痛苦的一步一步打断点流程。。

组件Liveroom是单例,每次登录都会初始化这个对象的内容

主要问题就在这个方法

- (void)login:(NSString*)serverDomain loginInfo:(LoginInfo *)loginInfo withCompletion:(ILoginCompletionHandler)completion {
[self asyncRun:^{
// 保存到本地
_serverDomain = serverDomain; [self login:loginInfo.sdkAppID accType:loginInfo.accType userID:loginInfo.userID userSig:loginInfo.userSig completion:^(int errCode, NSString *errMsg, NSString *userID, NSString *token) {
if (errCode == ROOM_SUCCESS) { completion(0, @"RoomService登录成功"); [self initApiAddr: loginInfo.userID token:token]; _appID = [NSString stringWithFormat:@"%d", loginInfo.sdkAppID]; // 初始化userInfo
_userInfo = [SelfAccountInfo new];
_userInfo.userID = loginInfo.userID;
_userInfo.userName = loginInfo.userName;
_userInfo.userAvatar = loginInfo.userAvatar;
_userInfo.sdkAppID = loginInfo.sdkAppID;
_userInfo.accType = loginInfo.accType;
_userInfo.userSig = loginInfo.userSig; // 初始化 RoomMsgMgr 并登录
RoomMsgMgrConfig *config = [[RoomMsgMgrConfig alloc] init];
config.userID = loginInfo.userID;
config.appID = loginInfo.sdkAppID;
config.accType = loginInfo.accType;
config.userSig = loginInfo.userSig;
config.userName = loginInfo.userName;
config.userAvatar = loginInfo.userAvatar;
config.level = loginInfo.level; //消息重复---注意多次登录组件,就会多次初始化下边这个对象,他是监测消息的,登录几次组件,就会有几个这样的对象,消息就会重复几次
//虽然游客退出了,但是这个对象不释放,他就会监听消息
if (_msgMgr) {
_msgMgr.delegate = nil;
[_msgMgr arcDebugRelease];
}
_msgMgr = [[RoomMsgMgr alloc] initWithConfig:config];
[_msgMgr setDelegate:self]; // [self sendDebugMsg:[NSString stringWithFormat:@"初始化IMSDK: appID[%d] userID[%@]", config.appID, config.userID]]; //IM已经在外头成功,这儿就不进行登录了 // __weak __typeof(self) weakSelf = self;
// [_msgMgr login:^(int errCode, NSString *errMsg) {
// [weakSelf asyncRun:^{
// [self sendDebugMsg:[NSString stringWithFormat:@"IM登录返回: errCode[%d] errMsg[%@]", errCode, errMsg]];
// if (errCode == 0 && completion) {
// completion(0, @"登录成功");
// } else if (errCode != 0 && completion) {
// completion(ROOM_ERR_IM_LOGIN, @"登录失败");
// }
// }];
// }];
}
else {
[self sendDebugMsg:[NSString stringWithFormat:@"初始化LiveRoom失败: errorCode[%d] errorMsg[%@]", errCode, errMsg]];
}
}];
}];
}

所有的信息都会被更新,然后对象会重新初始化,但是就是这个对象,坑的一笔

  _msgMgr = [[RoomMsgMgr alloc] initWithConfig:config];
[_msgMgr setDelegate:self];

需要判断之前单例里边的该对象存在,需要将他释放掉,腾讯没有游客登录,所以不需要这样的变态逻辑

 //消息重复---注意多次登录组件,就会多次初始化下边这个对象,他是监测消息的,登录几次组件,就会有几个这样的对象,消息就会重复几次
//虽然游客退出了,但是这个对象不释放,他就会监听消息
if (_msgMgr) {
_msgMgr.delegate = nil;
[_msgMgr arcDebugRelease];
}

上边这几句就是解决办法

总结一下:变态的流程,总会有变态的坑!

最新文章

  1. jquery 高度的获取
  2. 转-Android Studio *.jar 与 *.aar 的生成与*.aar导入项目方法
  3. Android的ADT内容助手快捷方式设置
  4. BITED数学建模七日谈之二:怎样阅读数学模型教材
  5. WSAEventSelect模型详解
  6. c#中const与readonly区别
  7. LittleTool之批量修改材质
  8. 把centos 网卡接口eth2改成eth0
  9. ANSI escape code
  10. C#经典系列-键值对
  11. 在linux中配置tomcat
  12. Linux下搭建 Cocos2d-x-2.1.4 编译环境
  13. Oracle 最简单的随系统自己主动启动
  14. Unity3D - Animator Controller循环依赖
  15. 我的 FPGA 学习历程(04)—— 练习 verilog 硬件描述语言
  16. python tkinter Text
  17. mysql学习一 常用语句
  18. 搭建SSH服务
  19. Mac terminal Javac
  20. Maven学习日记(二)---MAVEN创建多模块的项目

热门文章

  1. python3爬虫之Urllib库(二)
  2. IIC如何释放数据总线? 为什么=1就是释放?
  3. B1023 组个最小数 (20分)
  4. Tricky Sum
  5. 数据库sql中distinct用法注意事项
  6. 洛谷P1079 Vigenère 密码
  7. 步骤详解安装Apache web服务器
  8. 设计模式之第2章-抽象工厂模式(Java实现)
  9. js跨域post请求
  10. 二维数组的动态分配(new)、初始化(memset)和撤销(delete)