如何强制 ViewController 将 'b' 而不是 'a' 中的数据导出到下一个 VC?
Posted
技术标签:
【中文标题】如何强制 ViewController 将 \'b\' 而不是 \'a\' 中的数据导出到下一个 VC?【英文标题】:How do you force the ViewController to export the data in 'b' instead of 'a' to the next VC?如何强制 ViewController 将 'b' 而不是 'a' 中的数据导出到下一个 VC? 【发布时间】:2020-12-25 11:35:10 【问题描述】:这是我第一次尝试 XCode,以前在 MatLab 上工作,所以对此非常陌生。我这里有一个 VC(名为 guest2ViewController),我正试图将数据发送到下一个 VC(名为 resultsViewController)。不幸的是,VC 正在从行(打印“b”)而不是较早的行(打印“a”)导出数据。为什么会这样,我该如何解决?
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
let vc = segue.destination as? resultsViewController
if segue.identifier == "toresults"
//prioritise this part of code - call it part A
Database.database().reference(withPath: self.password).observeSingleEvent(of: .value, with: snapshot in
//dates
var arr = [String]()
//times
var arr1 = [String]()
//number of attendees
var arr2 = [String]()
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? DataSnapshot
let newobj=rest.children
while let rest1 = newobj.nextObject() as? DataSnapshot
arr.append(rest.key)
arr1.append(rest1.key)
arr2.append(String(rest1.childrenCount))
let guests = arr2.max()
var index = 0
for n in arr2
if n == guests
//print (index)
let datefromarray = String(arr[index])
let timefromarray = String(arr1[index])
let guests1 = String(Int(guests!)!)
vc?.databasedate = (datefromarray)
vc?.databasetime = (timefromarray)
vc?.databaseguests = (guests1)
break
index += 1
print(vc?.databasedate)
print(vc?.databasetime)
print(vc?.databaseguests)
print("a")
//this doesn't get sent to the next VC after taking the data from Firebase
)
print(vc?.databasedate)
print(vc?.databasetime)
print(vc?.databaseguests)
print("b")
//this gets sent to the next VC
【问题讨论】:
查看答案,但简而言之,这行print(vc?.databasedate)
将在闭包内执行 before 代码,因为代码比互联网快。如果您想使用 firebase 数据,则必须在 firebase 调用之后在闭包内完成。一般来说,关闭后你不应该有任何代码。因此,要么将数据从闭包发送到下一个 VC,要么使用答案中链接的完成处理程序。
【参考方案1】:
数据是从 Firebase(和大多数现代 Web API)异步加载的。这是为了防止在(可能很慢的)网络请求正在进行时阻止用户使用您的应用。
如果您签入调试器,您会看到 print("b")
发生在 vc?.databasedate = (datefromarray)
之前,这就解释了为什么您将错误的值传递给下一个视图控制器。
解决方案总是一样的:任何需要数据库数据的代码都需要在回调/关闭/完成处理程序中,或者从那里调用。
有关此内容和代码示例的更多信息,请参阅:
Firebase with Swift 3 counting the number of children Why isn't my function that pulls information from the database working? Access Firebase variable outside Closure getting data out of a closure that retrieves data from firebase Swift / How to use dispatch_group with multiple called web service? Completion handler Firebase observer in Swift【讨论】:
谢谢弗兰克!不幸的是,我的下一步仍然有点迷失 - 有什么建议要对上面的代码制作什么版本?以上是关于如何强制 ViewController 将 'b' 而不是 'a' 中的数据导出到下一个 VC?的主要内容,如果未能解决你的问题,请参考以下文章
在UITabBarController中强制特定的viewcontroller在landscape中
如何在 UIPageViewController 中的两个 ViewController 之间传递数据
如何从 navigationController(viewControllers/stack) 弹回指定 viewController?