【问题标题】:Swift only stores last item in ArraySwift 仅将最后一项存储在 Array 中
【发布时间】:2020-11-07 09:40:02
【问题描述】:

我想使用 firebase 检索一些数据并将其存储在一个空数组中。之后我必须将它存储在一个全局数组中(是的,我知道我不应该这样做)。 但是数组只存储最后一个变量。我可以假设这是因为 firebase 在此函数中检索数据的方式。 但我想将所有值附加到数组中。

也许有人可以帮助我:)

static func jobs(for user: User, completion: @escaping ([TeamMember]) -> 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 dict = child.value as? [String: Any] else {
                    print("Error")
                    return completion([])
                }
                
                
                
                
                let memberJob = dict["memberJob"] as! String
                print("memberJob: \(memberJob)")
                
                var memberJobs: [String] = []
                memberJobs.append(memberJob)
                
                for job in memberJobs {
                    print("New Job incoming: ", job)
                }
                
                globalJobs = memberJobs

            }        
    })
        
}

【问题讨论】:

  • 为什么要检索数据并将其存储在空数组中,然后再将其存储在全局数组中?你为什么不把它存储在全局数组中。另外,在这个用例中什么是“全局数组”?此外,您已经指定了一个完成处理程序,但除了在 child.value 为 nil 时返回一个空数组之外,您没有对它做任何事情?有几个很好的答案,但不了解您要做什么,这是猜测(尽管 good 猜测)。所以,如果你能稍微给我们一些线索,我们可以提供更准确的答案。

标签: ios arrays swift firebase


【解决方案1】:

这一行循环遍历快照中的每个子节点

for case let child as DataSnapshot in snapshot.children {

在该循环中创建var memberJobs: [String] = [],它是一个空数组。然后添加一个成员作业,使其具有一个项目。然后,您将此 1 项数组分配给 globalJobs = memberJobs,因此它们完全相同。对于循环for case let child as DataSnapshot in snapshot.children,此分配一次又一次地发生,这就是为什么您在结束时只剩下一项。

您应该在快照循环之前声明var memberJobs: [String] = [],并在快照循环完成后分配globalJobs = memberJobs

【讨论】:

    【解决方案2】:

    您正在循环的每次迭代中创建一个新的空数组。

    在循环之前创建一次并将数组分配给globalJobs之后循环

    static func jobs(for user: User, completion: @escaping ([TeamMember]) -> Void) {
         let ref = Database.database().reference().child("team").child(user.uid)
            
            ref.observe(DataEventType.value, with: { (snapshot) in
                var memberJobs: [String] = []
                for case let child as DataSnapshot in snapshot.children {
                    
                    guard let dict = child.value as? [String: Any] else {
                        print("Error")
                        return completion([])
                    }
                    let memberJob = dict["memberJob"] as! String
                    print("memberJob: \(memberJob)")
                    
                    
                    memberJobs.append(memberJob)
                }
                    
                for job in memberJobs {
                    print("New Job incoming: ", job)
                }
                    
                globalJobs = memberJobs         
        })
            
    }
    

    如果你只在失败时调用它,完成处理程序就没有意义。

    【讨论】:

      【解决方案3】:

      使用var memberJobs: [String] = [] 在每个循环中创建一个新数组

       var memberJobs: [String] = []
       memberJobs.append(memberJob)
      

      把这条线移出

      var memberJobs: [String] = []
      

      static func jobs(for user: User, completion: @escaping ([TeamMember]) -> Void) {
           let ref = Database.database().reference().child("team").child(user.uid)
              
             var memberJobs: [String] = []  /// hererererre 
      
              ref.observe(DataEventType.value, with: { (snapshot) in
                  for case let child as DataSnapshot in snapshot.children {
                      
                      guard let dict = child.value as? [String: Any] else {
                          print("Error")
                          return completion([])
                      }  
      
                      let memberJob = dict["memberJob"] as! String
                      print("memberJob: \(memberJob)")
                      
                      memberJobs.append(memberJob)
                      
                      for job in memberJobs {
                          print("New Job incoming: ", job)
                      }
      
                  }    
                      
                  globalJobs = memberJobs    
          })
              
      }
      

      【讨论】:

        猜你喜欢
        • 2015-12-24
        • 2021-06-01
        • 1970-01-01
        • 2016-02-06
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多