我如何 return 来自快照关闭的数组的值并将其用于准备 segue?
How do i return the value of an Array from snapshot closure and use it in prepare for segue?
我试图在快照块结束时立即获取 function.But 之外的数组的值,newArray 的值变为空。
即使在闭包结束后,我也想访问数组的值。
将值从 prepare for segue 传递到下一个 View Controller 后,该值仍然为空。
var newArray = [Any]()
func getData(refe: String) -> [Any]{
let currUser = Auth.auth().currentUser?.uid
let ref = Database.database().reference(fromURL: "MyURL").child("users/\(currUser!)/Questions/")
ref.child("\(refe)").observeSingleEvent(of: .childAdded, with:{ snapshot in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? DataSnapshot, let value = rest.value{
self.newArray.append(value as! Any)
}
print(self.newArray)
//This gives [test,test1,test2]
})
return newArray
// Here the Array is empty.
}
实际结果:[]
预期结果:[测试、测试 1、测试 2]
这个我也试过了
func getData(refe: String, completion: @escaping (([Any]) -> ())) {
var newArray = [Any]()
let currUser = Auth.auth().currentUser?.uid
let ref = Database.database().reference(fromURL: "MYURL").child("users/\(currUser!)/Questions/")
ref.child("\(refe)").observeSingleEvent(of: .childAdded, with: { snapshot in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? DataSnapshot, let value = rest.value{
newArray.append(value)
}
completion(newArray)
})
}
并在辅助函数中调用它
func getDataD() -> [Any]{
let ref = getReference()
var arr = [Any]()
self.getData(refe: ref) { (array) in
arr = array
// This gives [test,test1,test2]
}
return arr
// This gives []
}
之后调用准备segue的函数
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let detailViewController = segue.destination as? HostOptionTableViewController
else {
return
}
detailViewController.ref = getReference()
self.getData(refe: detailViewController.ref) { (array) in
detailViewController.data = array
}
}
}
执行后detailViewController.data的实际结果应该是[test,test1,test2]
但它是 []
在 prepareForSegue
里面调用 getData
已经太晚了,这应该在导航到第二个 vc
的动作里面
self.getData(refe:yourRef) { array in
self.performSegue(withIdentifier:"segueName",sender:array)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let detailViewController = segue.destination as? HostOptionTableViewController
else {
return
}
detailViewController.ref = getReference()
detailViewController.data = sender as! [Model] // Model is type of array
}
请求是异步的,导航将在获取数据之前发生
我试图在快照块结束时立即获取 function.But 之外的数组的值,newArray 的值变为空。 即使在闭包结束后,我也想访问数组的值。 将值从 prepare for segue 传递到下一个 View Controller 后,该值仍然为空。
var newArray = [Any]()
func getData(refe: String) -> [Any]{
let currUser = Auth.auth().currentUser?.uid
let ref = Database.database().reference(fromURL: "MyURL").child("users/\(currUser!)/Questions/")
ref.child("\(refe)").observeSingleEvent(of: .childAdded, with:{ snapshot in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? DataSnapshot, let value = rest.value{
self.newArray.append(value as! Any)
}
print(self.newArray)
//This gives [test,test1,test2]
})
return newArray
// Here the Array is empty.
}
实际结果:[]
预期结果:[测试、测试 1、测试 2]
这个我也试过了
func getData(refe: String, completion: @escaping (([Any]) -> ())) {
var newArray = [Any]()
let currUser = Auth.auth().currentUser?.uid
let ref = Database.database().reference(fromURL: "MYURL").child("users/\(currUser!)/Questions/")
ref.child("\(refe)").observeSingleEvent(of: .childAdded, with: { snapshot in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? DataSnapshot, let value = rest.value{
newArray.append(value)
}
completion(newArray)
})
}
并在辅助函数中调用它
func getDataD() -> [Any]{
let ref = getReference()
var arr = [Any]()
self.getData(refe: ref) { (array) in
arr = array
// This gives [test,test1,test2]
}
return arr
// This gives []
}
之后调用准备segue的函数
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let detailViewController = segue.destination as? HostOptionTableViewController
else {
return
}
detailViewController.ref = getReference()
self.getData(refe: detailViewController.ref) { (array) in
detailViewController.data = array
}
}
}
执行后detailViewController.data的实际结果应该是[test,test1,test2] 但它是 []
在 prepareForSegue
里面调用 getData
已经太晚了,这应该在导航到第二个 vc
self.getData(refe:yourRef) { array in
self.performSegue(withIdentifier:"segueName",sender:array)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let detailViewController = segue.destination as? HostOptionTableViewController
else {
return
}
detailViewController.ref = getReference()
detailViewController.data = sender as! [Model] // Model is type of array
}
请求是异步的,导航将在获取数据之前发生