我正在尝试通过填充从聊天室聊天SDK获取的所有消息来实现聊天日志控制器,并将它们填充到消息数组中:var messages = [Message]()
。因此我实现了以下功能:
func observeMessages() {
let modelmessage = Message()
//case of chat inside an Open Channel
if openChannel != nil {
SBDOpenChannel.getWithUrl((openChannel?.channelUrl)!) { (channel, error) in
let previousMessageQuery = channel?.createPreviousMessageListQuery()
previousMessageQuery?.loadPreviousMessages(withLimit: 100, reverse: false, completionHandler: { (messages, error) in
for message in messages!{
if let usermessage = message as? SBDUserMessage {
modelmessage.fromId = usermessage.sender?.nickname
//print (modelmessage.fromId)
modelmessage.text = usermessage.message!
modelmessage.timestamp = usermessage.createdAt
self.messages.append(modelmessage)
print ("////")
for element in self.messages {
print(element.text)
}
}
}
DispatchQueue.main.async(execute: {
self.collectionView?.reloadData()
})
})
}
}
//Case of a 1 on 1 chat
else {
}
}
以及负责填充UICollectionView的以下函数。
override func viewDidLoad() {
super.viewDidLoad()
collectionView?.backgroundColor = UIColor.white
collectionView?.register(ChatMessageCell.self, forCellWithReuseIdentifier: cellId)
setupInputComponents()
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return messages.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! ChatMessageCell
let message = self.messages[indexPath.item]
cell.textView.text = message.text
return cell
}
当我尝试打印messages
数组时,我意识到它被当前索引的元素填充到索引中的数字,所以我得到了例如:
////
Optional("Aaa")
////
Optional("Hello")
Optional("Hello")
////
Optional("Hello World")
Optional("Hello World")
Optional("Hello World")
.
.
.
//Until I complete 16 iterations so I get
////
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
答案 0 :(得分:2)
我觉得重新加载集合视图单元格的地方是错误的。 只需注释" self.collectionView?.reloadData()"看看它是否有所改变。
更新:
因为你写了这个"让modelmessage = Message()"在完成处理程序之外,所有值都引用同一个实例,因此每次都会被覆盖。只需在完成处理程序中移动它,您的问题就会得到解决。干杯