1. 我遇到的問題
第一個問題:
我遵守了RCIMUserInfoDataSource代理并實(shí)現(xiàn)了代理方法,但是每次都是第一次進(jìn)會話列表只顯示內(nèi)容不顯示頭像和名稱揖闸,然后我點(diǎn)其他界面之后再點(diǎn)回去就有了 這種往往是因?yàn)闆]有及時刷新列表以及融云用戶對于信息導(dǎo)致的
解決方法
requestDataWithUserID的代碼如下:
//在請求自己服務(wù)器數(shù)據(jù)刷新 賦值完融云用戶信息資料后
[JQTMessageHandlder getUserInfoWithUserIDs:userArray andModel:model callback:^(NSError *error, id obj) {
@strongify(self)
if (!error) {
JQTUsersInfoModel *usersInfo = (JQTUsersInfoModel *)obj;
NSLog(@"JQTUsersInfoModel-----%@",usersInfo);
JQTPersonInfoModel *model = usersInfo.users[0];
// 我在這里實(shí)例化了融云的用戶信息
_userInfo2=[[RCUserInfo alloc]init];
self.userInfo2.name = model.nickName;
self.userInfo2.portraitUri = model.iconURL;
//刷新融云對應(yīng)用戶信息
[[RCIM sharedRCIM]refreshUserInfoCache:_userInfo2 withUserId:userID];
//通知界面刷新
[[NSNotificationCenter defaultCenter]postNotificationName:kJQTNotificationrefreshMessageHeaderInfo object:nil];
}
}];
//注冊監(jiān)聽當(dāng)然要寫在當(dāng)前MessageMainViewController控制器的viewDidLoad里
實(shí)現(xiàn)代理方法:
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *))completion {
NSLog(@"----userId%@",userId);
if ([userId isEqualToString:[NSString stringWithFormat:@"%i",[JQTVistorManager currentUserID]]]) {
RCUserInfo *user = [[RCUserInfo alloc]init];
user.userId = [NSString stringWithFormat:@"%i",[JQTVistorManager currentUserID]];
user.name = [JQTVistorManager currentNick];
user.portraitUri = [JQTVistorManager currentIconURL];
return completion(user);
}
// //這里是別人的信息判斷我相信大家都可以看的懂
if (![userId isEqualToString:[NSString stringWithFormat:@"%i",[JQTVistorManager currentUserID]]]) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
[self requestDataWithUserID:userId];
if (_userInfo2) {
return completion(_userInfo2);
} else{
return completion(nil);
}
});
});
}
return completion(nil);
}
第二個問題:
我當(dāng)時并沒有仔細(xì)去研究,就匆匆寫在了我的聊天列表界面里.這導(dǎo)致我的app出現(xiàn)了一個問題衩茸,有幾個地方是直接調(diào)用聊天界面RCConversationViewController的,這幾個地方都沒有及時獲取到雙方的頭像昵稱信息蹲嚣,但只要加載過聊天列表界面,之后不管到哪個聊天界面都能正常加載頭像(這也是卡我最久的問題隙畜,下面有我的具體思路)
2. 我的實(shí)現(xiàn)過程以及思路
在設(shè)置融云的用戶聊天頭像和昵稱時,我首先是閱讀了融云官方sdk文檔议惰,然后再里面找到了這么一個方法,
/*!
用戶信息提供者
@discussion SDK需要通過您實(shí)現(xiàn)的用戶信息提供者言询,獲取用戶信息并顯示。
*/
@protocol RCIMUserInfoDataSource <NSObject>
/*!
獲取用戶信息
@param userId 用戶ID
@param completion 獲取用戶信息完成之后需要執(zhí)行的Block [userInfo:該用戶ID對應(yīng)的用戶信息]
@discussion SDK通過此方法獲取用戶信息并顯示运杭,請?jiān)赾ompletion中返回該用戶ID對應(yīng)的用戶信息。
在您設(shè)置了用戶信息提供者之后辆憔,SDK在需要顯示用戶信息的時候,會調(diào)用此方法虱咧,向您請求用戶信息用于顯示。
*/
- (void)getUserInfoWithUserId:(NSString *)userId
completion:(void (^)(RCUserInfo *userInfo))completion;
基于以上資料我開始思考和研究腕巡,又在簡書上看到了這么一個帖子
http://www.reibang.com/p/c1bb39c72223 作者:Joy愛在西元前
文中更為詳細(xì)的介紹了融云的Api的細(xì)節(jié)。
看了看才知道我用的是第二種方案绘沉。在慶幸自己沒有混用的同時,我就繼續(xù)思考车伞,為什么我只有加載過列表界面,之后不管到哪個聊天界面都能正常加載頭像呢帖世?我是不是忽略了什么,于是我又仔細(xì)找了找日矫,發(fā)現(xiàn) 官方之前有說明:
http://support.rongcloud.cn/kb/MjYx 相信大家結(jié)合這兩篇文章,已經(jīng)有點(diǎn)明白到底怎么回事了
3. 解決問題
既然知道了問題原因哪轿,就是代理方法不應(yīng)該寫在聊天列表這里,那么到底應(yīng)該寫到哪里呢窃诉?參照上面第二個鏈接的文章,不難推測飘痛,是不是應(yīng)該寫在AppDelegate里呢,那就試一試宣脉,結(jié)果試完了發(fā)現(xiàn)车柠,依然不行塑猖,我注意到了我自己寫的兩處代碼
//第一處我在登錄界面的登錄成功的時候?qū)懴铝? [JQTVistorManager storeIMToken:model.imToken];
[self loginRongYunCloud:model.imToken];
//這兒是實(shí)現(xiàn)該方法
- (void)loginRongYunCloud:(NSString *)imToken {
@weakify(self)
[[RCIM sharedRCIM] connectWithToken:imToken success:^(NSString *userId) {
[[RCIM sharedRCIM] setUserInfoDataSource:self];
NSLog(@"登陸成功。當(dāng)前登錄的用戶ID:%@", userId);
} error:^(RCConnectErrorCode status) {
NSLog(@"登陸的錯誤碼為:%d", status);
} tokenIncorrect:^{
//token過期或者不正確羊苟。
//如果設(shè)置了token有效期并且token過期,請重新請求您的服務(wù)器獲取新的token
//如果沒有設(shè)置token有效期卻提示token錯誤蜡励,請檢查您客戶端和服務(wù)器的appkey是否匹配,還有檢查您獲取token的流程巍虫。
NSLog(@"token錯誤");
}];
}
(由于我的app產(chǎn)品設(shè)計(jì)有游客模式,這是前提)登錄成功了才有token 有了token才能去做一系列處理 在AppDelegate里顯然還未登錄占遥,先后順序錯了,自然就無效
所以最終在登錄界面添加了最開始那些代碼瓦胎,問題總算是解決了.希望我的小小的經(jīng)驗(yàn)也能幫助到跟我遇到同樣問題的你們.
以上純屬本人原創(chuàng),如有錯誤望指正搔啊,轉(zhuǎn)載請標(biāo)明來源和作者柬祠。by:鏡花水月cy