如何强制 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中

如何将 const void* 强制转换为结构元素?

如何在 UIPageViewController 中的两个 ViewController 之间传递数据

如何从 navigationController(viewControllers/stack) 弹回指定 viewController?

IOS7:Pop ViewController 强制 UIImageView 掉落

ios9中的强制方向