如何将FirebaseReference.observeSingleEvent的变量用于另一个函数

时间:2017-11-24 17:26:32

标签: ios swift firebase closures

我想在另一个函数中使用 variable_a 。实际上,我想将这些数据加载到tableviewcell中。

func readFIRData()  {
    var credentials:[String]
    let userID = Auth.auth().currentUser?.uid
    ref = Database.database().reference().child("usr").child(userID!)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        let Name = value?["firstName"] as? String ?? ""
        let PhoneNo = value?["mobile"] as? String ?? ""


        var variable_a = [Name,PhoneNo]


        self.tableView.reloadData()
    }) { (error) in
    }
}

2 个答案:

答案 0 :(得分:0)

你应该在readFIRData函数中有一个回调(完成处理程序),并将 variable_a 作为该回调中的参数传递。将其解析为在表视图中使用的对象,并在回调中重新加载tableView。

功能应如下所示:

func readFIRData(_ completion: ([Name,PhoneNo]) -> ())  {
    var credentials:[String]
    let userID = Auth.auth().currentUser?.uid
    ref = Database.database().reference().child("usr").child(userID!)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        let Name = value?["firstName"] as? String ?? ""
        let PhoneNo = value?["mobile"] as? String ?? ""

        var variable_a = [Name,PhoneNo]
        completion(variable_a)
    }) { (error) in
    }
}

然后有另一个函数调用readFIRData函数:

func requestData() {
   readFIRData() { [weak self] data in
        guard let `self` = self else { return }
        self.data = data
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
   }
 }

提及如何返回主线程以重新加载tableView。通过self.data,我假设您将在表视图中使用的数据来实例化单元格。

答案 1 :(得分:0)

解决这个问题

 func GetData(completion: @escaping(_ credentials: [String]) -> Void)  {
    let userID = Auth.auth().currentUser?.uid
    ref = Database.database().reference().child("usr").child(userID!)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in

    let value = snapshot.value as? NSDictionary
    let Name = value?["firstName"] as? String ?? ""
    let PhoneNo = value?["mobile"] as? String ?? ""


    var variable_a = [Name,PhoneNo]

    completion(variable_a)
    self.tableView.reloadData()
}) { (error) in
}
}

现在,将 StringArray 分配给某个变量。使用下面的代码进行分配。同样,变量 StringArrayVariable 可用于填充tableview单元格。

GetData { (StringArray) in
        self.StringArrayVariable= StringArray
    }