碰到了个数据处理的需求,判断融云本地数据库中所有人的聊天记录,删除其中两天前并且没有任何回复的聊天列表。
一开始天真的将所有本地数据库中的数据全部抓了出来,结果发现数据量太大了,直接给主线程卡死,或者瞬间内存飙升把app给卡掉了。 后来发现融云有分页的方法,开启子线程,通过分页的方式(每页只取20条数据),然后进行递归查找,这样保证了主线程正常操作,不会影响子线程的数据处理。
//清除两天之前所有只发送没有回复的消息
func cleanTwoDayAllSingleChat(){
DispatchQueue.global().async {
checkCurrentAllMessageData()
DispatchQueue.main.async {
self.refreshConversationTableViewIfNeeded()
}
}
}
}
/// 分页查询整个聊天列表
/// - Parameter startTime: 根据收到时间开始查询(0从最新一条开始查起)
func checkCurrentAllMessageData(startTime: Int64 = 0) {
var allMessageArray = [RCConversation]()
let messageArray = RCIMClient.shared()?.getConversationList([1], count: 20, startTime: 0) as? [RCConversation]
if let tempArray = messageArray{
if tempArray.count == 20{
allMessageArray.append(contentsOf: tempArray)
checkCurrentAllMessageData(startTime: tempArray[19].receivedTime)
}else{
allMessageArray.append(contentsOf: tempArray)
//全部数据
for item in allMessageArray{
//客服不用进行清除
if item.targetId != "e7523c3d5d2446829e77d44c317f3311"{
let newMessage = RCIMClient.shared().getMessage(item.lastestMessageId)!
checkCurrentMessagesData(targetID: item.targetId, messageID: item.lastestMessageId, receivedTime: Int64(item.receivedTime), newMessage: newMessage)
}
}
}
}
}
/// 递归查询当前人员全部聊天数据
/// - Parameters:
/// - targetID:会话ID
/// - messageID: 消息ID
/// - receivedTime: 最新一条消息的接收时间
/// - newMessage: 最新一条消息模型
func checkCurrentMessagesData(targetID: String, messageID: Int, receivedTime: Int64, newMessage: RCMessage){
var allChatMessageArray = [RCMessage]()
let messageArray = RCIMClient.shared()?.getHistoryMessages(.ConversationType_PRIVATE, targetId: targetID, oldestMessageId: messageID, count: Int32(20)) as? [RCMessage]
if let tempArray = messageArray{
if tempArray.count == 20{
allChatMessageArray.append(contentsOf: tempArray)
checkCurrentMessagesData(targetID: targetID, messageID: messageID, receivedTime: receivedTime, newMessage: newMessage)
}else{
allChatMessageArray.insert(newMessage, at: 0)
allChatMessageArray.append(contentsOf: tempArray)
let timeInterval:TimeInterval = Date().timeIntervalSince1970
let timeStamp = Int(timeInterval)
let twoDayAgoTime = timeStamp - 60
//从来没有回复过,并且最新一条的记录已经是两天之前的数据
if !judgeTimeAndCondition(messageArray: allChatMessageArray) && (receivedTime / 1000) <= twoDayAgoTime{
RCIMClient.shared()?.clearHistoryMessages(.ConversationType_PRIVATE, targetId: targetID, recordTime: 0, clearRemote: true, success: {}, error: { (error) in})
RCIMClient.shared()?.remove(.ConversationType_PRIVATE, targetId: targetID)
}
}
}
}
/// 判断两个人是否有过回复
/// - Parameter messageArray: 全部消息数组
/// - Returns: true回复过,false没有
func judgeTimeAndCondition(messageArray: [RCMessage]) -> Bool{
for (index,item) in messageArray.enumerated(){
if (index + 1) <= (messageArray.count - 1){
if item.senderUserId != messageArray[index + 1].senderUserId{
//两个人之间有回复
return true
}else{
continue
}
}else{
//数据全部查完,没有符合条件
return false
}
}
//没有聊天数据
return false
}