viewDidLoad()中的Swift 4变量初始化

viewDidLoad()中的Swift 4变量初始化,swift,Swift,我是一个有点敏捷的新手,我遇到了一个真正困扰我的问题 在下面的代码中: class TestViewController: UIViewController { var userNames : [String] = {return DatabaseMethods.getUsers()}() override func viewDidLoad() { super.viewDidLoad() print(userNames) } } print语句每次都将打印一个空

我是一个有点敏捷的新手,我遇到了一个真正困扰我的问题

在下面的代码中:

class TestViewController: UIViewController {

  var userNames : [String] = {return DatabaseMethods.getUsers()}()

  override func viewDidLoad() {
    super.viewDidLoad()
    print(userNames)
  }
}
print语句每次都将打印一个空数组。(一) 我不知道为什么会发生这种情况,而且(II)我还没有找到一种方法来回避这个问题。下面是DatabaseMethods类的外观:

class DatabaseMethods {

static func getUsers() -> [String] {
    var userNames = [String]()
    db.collection("users").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                let data = document.data()
                let first : String = data["First"] as! String
                let last : String = data["Last"] as! String
                userNames.append("\(first) \(last)")
            }
        }
    }
    return userNames
}

}

使用viewdidload方法进行请愿,我希望您的方法不会被执行,因为您没有在viewdidload中初始化,并且存在异步问题。试着这样做:

class TestViewController: UIViewController {

  var userNames : [String] = []

  override func viewDidLoad() {
    super.viewDidLoad()
    userNames = DatabaseMethods.getUsers()
    print(userNames)
  }
}
在代码中,您试图创建一个惰性变量,而不仅仅是一个变量。

db.collection(“users”).getDocuments()
是异步的,这就是它需要闭包的原因。使用
DispatchGroup
可以使
getUsers()
同步,以便在调用结束时让所有用户返回

static func getUsers() -> [String] {
    let group = DispatchGroup()
    group.join()
    var userNames = [String]()
    db.collection("users").getDocuments() { (querySnapshot, err) in
        defer { group.leave() }
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                let data = document.data()
                let first : String = data["First"] as! String
                let last : String = data["Last"] as! String
                userNames.append("\(first) \(last)")
            }
        }
    }
    group.wait()
    return userNames
}

由于数组是值类型,将返回一个空副本,因此使用旧方法更新也不会到达它,因为值类型被复制,而引用类型不是。

您能给我们展示一下
数据库方法
类吗?特别是
.getUsers()
method?可能是getUsers()内部的异步逻辑缺失。为什么要编写
var用户名:[String]={return DatabaseMethods.getUsers()}()
?您应该能够简单地编写
var userNames=DatabaseMethods.getUsers()
,不是吗?那么
getUsers()是什么意思呢
数据库方法上执行操作
?我附加了对DBMethods类的引用这对我也不起作用。我添加了.getUsers()方法以获取更多上下文