集合视图未在主线程中重新加载

问题描述

使用 MessageKit 和 Socket IO 使用聊天功能

场景最初收到消息文本和图像,但一旦返回然后再次连接套接字并尝试接收文本消息不起作用但收到图像消息。

在之前的视图控制器中,如果套接字状态已连接,我会断开它的连接。

调试后获取套接字正在第二次工作并且还更新了 messageList 但是重新加载集合视图不起作用并更新单元格

套接获取聊天短信:

                   socket.connect()
                   socket.on(clientEvent: .connect) {data,ack in
                   socket.emit("login",[ "userId": "\(self.defaults.value(forKey:   BDConstant.kUserSellerId) ?? "")"])
                    socket.on("login") { ( dataArray,ack) -> Void in
                    print("live chat list seller ids:\(dataArray[0])")
                    }
                    //Get receiver message from socket
                    socket.on("chat text") { ( dataArray,ack) -> Void in
                    
                    if !dataArray.isEmpty{
                        
                        var senderType = "" //receiver or sender
                        
                        ///Get data from socket
                        var arrOuterObject : Array<Any>
                        arrOuterObject = dataArray[0] as! Array<Any>
                        
                        var arrInnerObject : Array<Any>
                        arrInnerObject = arrOuterObject[0] as! Array<Any>
                        
                        let txt = arrInnerObject[0]
                        let toMessage : String
                        let fromMessage: String
                        //var message:MockMessage?
                        
                        toMessage = arrOuterObject[1] as! String
                        fromMessage = arrOuterObject[2] as! String
                        
                        var strFromSellerId = ""
                        var strSellerId = "\(self.defaults.value(forKey: BDConstant.kUserSellerId) ?? "")"
                        if let fromSellerId = fromMessage as? String{
                            strFromSellerId = fromSellerId
                        }
                        if !strSellerId.isEmpty && !strFromSellerId.isEmpty{
                            if strSellerId == strFromSellerId{
                                senderType = "apple"
                            }else{
                                senderType = "orange"
                            }
                            
                            
                            let text = txt as? String
                            
                            if text != ""{
                                
                                let user = MockUser(senderId: senderType,displayName: "")
                                let uniqueID = UUID().uuidString
                                let Now = Date()
                                let message = MockMessage(text:text!,user: user,messageId: uniqueID,date:Now)
                                self.messages.append(message)
                                
                            }
                            dispatchQueue.main.async {
                                self.messageList = self.messages
                                self.messagesCollectionView.reloadData()
                                self.messagesCollectionView.scrollToLastItem()
                            }
                            
                        } else {
                            print("Error")
                        }
                    }
                }
            }

套接获取聊天图像消息:

                socket.on("chat message") { ( dataArray,ack) -> Void in
                if !dataArray.isEmpty{
                    var multi:String = ""
                    var action:String = ""
                    var buyerid:String = ""
                    var ftime:String = ""
                    var image:String = ""
                    var message:String = ""
                    var sellerid:String = ""
                    var platformtype:String = ""
                    var docodedImage = UIImage()
                    var senderType = "" //receiver or sender
                    let chatDictionary = dataArray[0] as? [String: Any]
                    
                    if let Multi = chatDictionary?["Multi"] as? String{
                        multi = Multi
                    }
                    if let Action = chatDictionary?["action"] as? String{
                        action = Action
                    }
                    if let Buyerid = chatDictionary?["buyerid"] as? String{
                        buyerid = Buyerid
                    }
                    if let Ftime = chatDictionary?["ftime"] as? String{
                        ftime = Ftime
                    }
                    if let Image = chatDictionary?["image"] as? String{
                        image = Image
                    }
                    if let Sellerid = chatDictionary?["sellerid"] as? String{
                        sellerid = Sellerid
                    }
                    if let Platformtype = chatDictionary?["plateform_type"] as? String{
                        platformtype =  Platformtype
                    }
                    ///orange - receiver
                    ///apple - sender
                    do {
                        if !action.isEmpty && !image.isEmpty{
                            if let dataDecoded : Data = Data(base64Encoded: image,options: .ignoreUnkNownCharacters){
                                guard let dataToImage = UIImage(data: dataDecoded) else { return }
                                docodedImage = dataToImage
                                
                            }else{
                                print("error dataDecoded")
                            }
                            
                            let strSellerId = "\(self.defaults.value(forKey: BDConstant.kUserSellerId) ?? "")"
                            
                            if strSellerId == sellerid{
                                senderType = "apple"
                            }else{
                                senderType = "orange"
                            }
                            
                            let user = MockUser(senderId: senderType,displayName: "")
                            let uniqueID = UUID().uuidString
                            let Now = Date()
                            let message = MockMessage(image: docodedImage,date: Now)
                            self.messages.append(message)
                            
                            dispatchQueue.main.async {
                                self.messageList = self.messages
                                self.messagesCollectionView.reloadData()
                                self.messagesCollectionView.scrollToLastItem()
                            }
                        }
                    }catch{
                        print("error :\(error)")
                    }
                }
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...