试图快速删除从firebase检索到的数组中的重复值

Posted

技术标签:

【中文标题】试图快速删除从firebase检索到的数组中的重复值【英文标题】:Trying to erase duplicated values in array retrieved from firebase in swift 【发布时间】:2020-07-21 12:10:35 【问题描述】:

我正在尝试从 firebase 字典中检索名为 memberJob 的值。在我检索它之后,目标是删除重复项,在 TableView 中显示唯一值。 问题是 jobs 是空的,但 memberJob 在循环时实际上有值。

也许有人可以帮助我! :)

import UIKit
import FirebaseDatabase
import Foundation
import FirebaseFirestoreSwift
import CodableFirebase

class ProjectCharacterViewController: UIViewController 
    
    
    
// MARK: - Properties
    
   
    @IBOutlet weak var specTxt: UITextField!
    @IBOutlet weak var difficultyTxt: UITextField!
    @IBOutlet weak var budgetTxt: UITextField!
    @IBOutlet weak var tableView: UITableView!
    
    var member = [TeamMember]()
    var jobs: [String] = []
    var uniqueJobs = [MemberJobsStruct]()
    var soloJobs: [String] = []
    var singleJobs: [String] = []

    
    var test =  ["Hallo", "Birne", "Apfel"]
    
    
     
    

    override func viewDidLoad() 
        super.viewDidLoad()
        
        getJobs(for: User.current)  (memberJob) in
            self.uniqueJobs = memberJob
        
        
        soloJobs = removeDuplicates(array: jobs)
        print("SoloJobs :", soloJobs)
        
        DispatchQueue.main.async 
               self.tableView.reloadData()
                   

        
    
    

    

// MARK: - Functions
    
    
    func gettheJob() 
              soloJobs = removeDuplicates(array: jobs)
          
          print("These are the unique Jobs: ", soloJobs)
        
       
      
      
    
    func getJobs(for user: User, completion: @escaping ([MemberJobsStruct]) -> Void) 
        
         
         let ref = Database.database().reference().child("team").child(user.uid)
         
         
                 ref.observe(DataEventType.value, with:  snapshot in
                    for case let child as DataSnapshot in snapshot.children 
                    guard let value = child.value as? [String: Any] else 
                        return completion ([])
                        
                
                        let memberJob = value["memberJob"] as! String
                        self.jobs.append(memberJob)
                        
                       
                    
                 )
           
    
  
func removeDuplicates(array: [String]) -> [String] 
    var encountered = Set<String>()
    var result: [String] = []
    for value in array 
        if encountered.contains(value) 
            // Do not add a duplicate element.
        
        else 
            // Add value to the set.
            encountered.insert(value)
            // ... Append the value.
            result.append(value)
        
    
    return result
    


// MARK: - UITableViewDataSource

extension ProjectCharacterViewController: UITableViewDataSource 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return soloJobs.count
        
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
      
//            let job = jobs[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: "ProjectCharacterTableViewCell") as! ProjectCharacterTableViewCell
        cell.jobLabel.text = soloJobs[indexPath.row]
            return cell
        
    


// MARK: - UITableViewDelegate

extension ProjectCharacterViewController: UITableViewDelegate 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
     return 60
    


更新:我试图简单地创建一个新数组 soloJobsout of jobs,但即使这样也不起作用。做这样的事情的正确方法是什么?现在我尝试了几种方法,包括这个,但没有任何效果......

  func getJobs(for user: User, completion: @escaping ([MemberJobsStruct]) -> Void) 
        
         var jobs: [String] = []

         let ref = Database.database().reference().child("team").child(user.uid)
        
                 ref.observe(DataEventType.value, with:  snapshot in

                    for case let child as DataSnapshot in snapshot.children 
                    guard let value = child.value as? [String: Any] else 
                        return completion ([])
                        
                
                        let memberJob = value["memberJob"] as! String
                        jobs.append(memberJob)
                        DispatchQueue.main.async 
                                   self.tableView.reloadData()
                               
                    
                 )
            soloJobs = jobs
        
        
      

           

【问题讨论】:

你在哪里使用removeDuplicates 还没有......因为数组本身仍然是空的。该功能正在运行。我只需要得到工作数组 如果您不想在数据库中出现重复,更有效的方法是在添加记录之前检查重复 不不,非常需要重复!只是在这个 vc 中,我希望人们选择所需的工作数量。不同的团队成员配置文件正在获取作业。但如果以3个摄像师为例,显然1x摄像师就足够展示了,所以要选择数量 【参考方案1】:

getJobs 方法附加jobs 之后,您可能只是缺少应该重新加载UITableView 的部分。

func getJobs(for user: User, completion: @escaping ([MemberJobsStruct]) -> Void) 
    //...
    ref.observe(DataEventType.value, with:  snapshot in
        for case let child as DataSnapshot in snapshot.children 
            //...
        
        DispatchQueue.main.async 
            self.tableView.reloadData()
        
    )

更新:使用 here 的扩展方法从数组中获取唯一对象。

【讨论】:

谢谢!它现在实际上工作了 buuuuut 我想实际删除重复项并将唯一变量存储在一个名为 soloJobs 的新数组中,因此只在表格视图中显示这些变量。但实际上它不起作用。我将问题中的代码修改为新代码?还有其他帮助吗? :) 检查我在上面发布的更新以从数组中删除重复项。使用它,你会得到你的结果。 这很奇怪,我只是不明白。为什么我什至不能在不删除重复值的情况下从jobs 中创建一个名为soloJobs 的新数组?我几乎尝试了所有可能性......现在在我的问题的更新区域这是我的方法,但是没有任何效果......

以上是关于试图快速删除从firebase检索到的数组中的重复值的主要内容,如果未能解决你的问题,请参考以下文章

Firebase/Android:将检索到的值从 Firebase 添加到 arraylist 会返回空指针异常

每当我尝试在从 firebase 检索到的地图上显示位置时,都会出现错误 [重复]

在firebase中的数组中添加一个字段而不删除firebase中的其他字段[重复]

我如何从firebase检索数据到android listview顶部[重复]

从 firebase 检索数据并将其显示在可扩展的 recyclerview 中

Android - 持久化从 Firebase 检索到的数据