【问题标题】:How to use Values after retrieving data with firebase in swift?swift - 使用firebase检索数据后如何使用Values?
【发布时间】:2020-11-11 06:32:28
【问题描述】:

到目前为止,我一直使用从 firebase 检索的数据,除了显示之外,无需对它们做任何事情。 现在我实际上需要将数据存储在另一个数组中和/或一般来说我真的很想知道如何实际处理数据。

我现在的方法看起来像这样,但实际上不起作用。

有人知道怎么做吗?

....

class ProjectCharacterViewController: UIViewController {
    
    
    
// MARK: - Properties

    var soloJobs: [String] = []

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        getJobs(for: User.current) { (memberJob) in
            self.uniqueJobs = memberJob
        }
        
    }

...

 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
           }

【问题讨论】:

  • 我不太理解你的问题。它不起作用是什么?它是“作业”数组的附加函数吗?
  • 对不起!实际上这不起作用,但例如,我想在jobs 中创建一个数组soloJobs,但无论我尝试使用哪种不同的可能性,soloJobs 总是保持一个空数组。也许这让我的问题更清楚了? :)

标签: ios arrays swift firebase


【解决方案1】:

由于observe 函数是一个异步调用,您的soloJobs = jobs 将在它之前被调用。这就是它返回空数组的原因,因为那时您的 jobs 数组也是空的。考虑在你的 for 循环中这样调用它:

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)
            self.soloJobs = jobs

            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多