【发布时间】:2021-04-21 06:04:07
【问题描述】:
我有一个使用 Firestore 的聊天应用程序,当一个新的 document or -> (message) 添加到 Firestore 时,我的 collectionView 重新加载所有数据,应用程序冻结一秒钟,直到所有数据重新加载,我不太了解collectionViews 但我认为如果没有错,这是因为 collectionView 试图计算每个单元格的大小,这是调试器消息
The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7fbd974b3c40>, and it is attached to <UICollectionView: 0x7fbd97930600; frame = (0 61; 414 663); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600002c5df20>; layer = <CALayer: 0x6000023f9640>; contentOffset: {-5, -5}; contentSize: {404, 8}; adjustedContentInset: {5, 5, 5, 5}; layout: <UICollectionViewFlowLayout: 0x7fbd974b3c40>; dataSource: <DELEVARE___ديليفري.DriverChat: 0x7fbd97843600>>.
2021-01-16 13:54:43.232052+0200 DELEVARE - ديليفري[51104:999159] Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.
symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.
这个调试器消息被调用repeated,每个单元格都加载到collectionView,这是我的collectionView How to solve UICollectionViewFlowLayoutBreakForInvalidSizes
我不知道如何只将新的附加项插入到 collectionView 中的数组中,我希望它能够像普通聊天应用一样做出反应。
我试过了
func getMessages(){
guard let uid = Auth.auth().currentUser?.uid else {return}
let firestore = Firestore.firestore()
let doc = firestore.collection("طلبات قيد العمل").whereField("driverUid", isEqualTo: uid)
doc.getDocuments { (query, err) in
if err != nil {
print(err?.localizedDescription ?? "")
}
for document in query!.documents{
let chatDoc = document.reference.collection("المحادثات")
chatDoc.addSnapshotListener { (querysnap, err) in
if err != nil {
print(err?.localizedDescription ?? "")
}
self.messages = []
for snap in querysnap!.documents{
let data = snap.data()
guard let message = data["message"] as? String else {return}
guard let senderid = data["senderID"] as? String else {return}
guard let timestamp = data["date"] as? Timestamp else {return}
let date = Date(timeIntervalSince1970: TimeInterval(timestamp.seconds))
if senderid == Auth.auth().currentUser?.uid{
let drivermessages = driverMessages(image: UIImage(), text: message, date: date, isSender: true, driverid: senderid)
// this line of code is doing the same as collectionView.reloadData()
self.collectionView?.performBatchUpdates({
let indexPath = IndexPath(row: self.comments.count, section: 0)
self.messages.append(drivermessages)
self.collectionView?.insertItems(at: [indexPath])
}, completion: nil)
}else {
guard let message2 = data["message"] as? String else {return}
guard let senderid2 = data["senderID"] as? String else {return}
guard let timestamp2 = data["date"] as? Timestamp else {return}
guard let img = self.profileImg else {return}
let date2 = Date(timeIntervalSince1970: TimeInterval(timestamp2.seconds))
let usermessages = driverMessages(image: img, text: message2, date: date2, isSender: false, driverid: senderid2)
self.messages.append(usermessages)
self.collectionView?.performBatchUpdates({
let indexPath = IndexPath(row: self.comments.count, section: 0)
self.messages.append(usermessages)
self.collectionView?.insertItems(at: [indexPath])
}, completion: nil)
}
}
}
}
}
}
这是我的代码
func getMessages(){
guard let uid = Auth.auth().currentUser?.uid else {return}
let firestore = Firestore.firestore()
let doc = firestore.collection("طلبات قيد العمل").whereField("driverUid", isEqualTo: uid)
doc.getDocuments { (query, err) in
if err != nil {
print(err?.localizedDescription ?? "")
}
for document in query!.documents{
let chatDoc = document.reference.collection("المحادثات")
chatDoc.addSnapshotListener { (querysnap, err) in
if err != nil {
print(err?.localizedDescription ?? "")
}
self.messages = []
for snap in querysnap!.documents{
let data = snap.data()
guard let message = data["message"] as? String else {return}
guard let senderid = data["senderID"] as? String else {return}
guard let timestamp = data["date"] as? Timestamp else {return}
let date = Date(timeIntervalSince1970: TimeInterval(timestamp.seconds))
if senderid == Auth.auth().currentUser?.uid{
let drivermessages = driverMessages(image: UIImage(), text: message, date: date, isSender: true, driverid: senderid)
self.messages.append(drivermessages)
}else {
guard let message2 = data["message"] as? String else {return}
guard let senderid2 = data["senderID"] as? String else {return}
guard let timestamp2 = data["date"] as? Timestamp else {return}
guard let img = self.profileImg else {return}
let date2 = Date(timeIntervalSince1970: TimeInterval(timestamp2.seconds))
let usermessages = driverMessages(image: img, text: message2, date: date2, isSender: false, driverid: senderid2)
self.messages.append(usermessages)
}
DispatchQueue.main.async {
self.collectionView.reloadData()
let item = self.messages.count - 1
let insertionIndexPath = IndexPath(item: item, section: 0)
self.collectionView.scrollToItem(at: insertionIndexPath, at: .bottom, animated: true)
}
}
}
}
}
}
【问题讨论】:
标签: ios swift google-cloud-firestore uicollectionview