Swift 融云根据时间删除部分聊天记录

304 阅读2分钟

碰到了个数据处理的需求,判断融云本地数据库中所有人的聊天记录,删除其中两天前并且没有任何回复的聊天列表。

一开始天真的将所有本地数据库中的数据全部抓了出来,结果发现数据量太大了,直接给主线程卡死,或者瞬间内存飙升把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
}