Firebase导入数据至TableView时如何避免同名客户单元格重复?
如何避免Firebase导入TableView时出现同名客户的重复单元格?
你现在碰到的问题很典型——同一个客户因为在Firebase里有多个子节点数据,导致TableView里生成了重复的单元格。先看看你的数据库结构和当前的TableView效果:
数据库结构

当前TableView显示结果

问题出在哪?
看你提供的代码,现在的逻辑是遍历每个客户的子节点,每遍历一个就创建一个CustomerModel并添加到数组,所以同一个客户的多个子节点会生成多个重复的模型对象,TableView自然就显示重复项了。
解决方案:通过客户唯一ID去重
要解决这个问题,我们需要用客户的**唯一标识(比如ID字段,姓名可能重复,但ID肯定是唯一的)**来判断是否已经添加过该客户,避免重复插入数组。
修改后的代码如下:
let userID = Auth.auth().currentUser!.uid let usersDatabaseRef = Database.database().reference().child("usersDatabase").child(userID).child("Customers") usersDatabaseRef.observe(.value, with: { snapshot in print("there are \(snapshot.childrenCount) users") // 用字典记录已添加的客户ID,避免重复 var addedCustomerIDs = [String: Bool]() // 先清空数组,防止新旧数据叠加重复 self.candies.removeAll() self.filteredCandies.removeAll() for child in snapshot.children { let childSnap = child as! DataSnapshot print("user: \(childSnap.key)") let userCustomerSnap = childSnap for customer in userCustomerSnap.children.allObjects as! [DataSnapshot] { let customerSnap = customer let dict = customerSnap.value as! [String: Any] let name = dict["Name and surname"] as? String let phone = dict["Phone"] as? String let company = dict["Company name"] as? String let customerID = dict["ID"] as? String let email = dict["Email"] as? String let nip = dict["Nip1"] as? String let postal = dict["Postal code"] as? String let street = dict["Street"] as? String let town = dict["Town"] as? String // 校验客户ID,已存在则跳过当前子节点 guard let id = customerID, !addedCustomerIDs.keys.contains(id) else { continue } let myCustomer = CustomerModel( name: name, phone: phone, company: company, customerID: id, email: email, nip: nip, postal: postal, street: street, town: town ) self.candies.append(myCustomer) self.filteredCandies.append(myCustomer) // 标记该ID已添加 addedCustomerIDs[id] = true } } self.tableViewCustomer.reloadData() })
关键修改点说明:
- 新增
addedCustomerIDs字典:用来跟踪已经添加到数组中的客户ID,确保每个客户只被处理一次 - 提前清空数组:每次获取Firebase新数据时,先清空
candies和filteredCandies,避免旧数据和新数据重复累加 - ID校验逻辑:在创建CustomerModel之前,先检查当前客户的ID是否已经存在于字典中,如果存在就跳过,否则才添加到数组并标记ID已存在
如果你的数据库中,同一个客户的不同子节点包含不同的信息(比如不同的联系方式),你可能还需要考虑合并这些信息(比如把多个电话合并到一个字段),但如果只是要显示客户姓名,上面的代码就足够让每个客户只显示一个单元格了。
内容的提问来源于stack exchange,提问作者Christopher Kolodziej
相关产品推荐
相关产品推荐

