ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift

Posted

技术标签:

【中文标题】ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift【英文标题】:ViewDidLoad not performing actions in the right order - Firebase, Swift 【发布时间】:2019-03-08 21:37:59 【问题描述】:

当我尝试在模拟器上(也在设备上,结果相同)上运行以下代码时,我遇到了一个问题:该函数首先执行以下代码的第 2 部分(cmets 只是为了拥有作为参考,代码本身完全在 viewDidLoad 中。只是为了清楚起见),然后它执行第 1 部分(firebase 部分)。我需要在另一个函数之前执行 ref.child.... 函数,因为“createAlbums”函数需要从我的数据库中获取的专辑(所以完成块是完美的,但该函数不允许我放置任何)。

我想到了一对解决方案:

    一种添加完成块的方法(请记住,ref.child... func 就像一个循环,因此它将打印在数据库中找到的每个单个值的整个“专辑”数组。

    创建一个 Int var 并使 2 部分的代码只有在 var 的值与数据库中“Albums”的值的个数相同时才运行,所以它会填满本地“专辑”数组。

    使用两个不同的函数:viewDidLoad 和 viewDidAppear。据我所知,第二个将在第一个之后执行。

哪一个是最好的解决方案?有没有更好的解决方案? 我还请您就如何创建自己的解决方案提出建议,因为我可以从逻辑上得出结论,但我不确定能否在 Xcode 中开发它们。

只是总结整个线程:如何使以下代码的 2 部分在 1 部分之后运行?而且为什么之前运行,即使写的顺序是正确的,编译器从第1行一直运行到最后一行?

感谢您的帮助,并为我的英语不好感到抱歉,我希望您能理解一切,不幸的是,试图用英语解释一个“复杂”的问题并不总是那么容易。

但我认为版主会一如既往地做出一些更正!

// 1
let ref = Database.database().reference()
var albums: [String] = [String]()

override func viewDidLoad() 
    super.viewDidLoad()
    ref.child("Albums").observe(.childAdded)  (snapshot) in
        albums.append(snapshot.key)

        print("\(albums)")
        print("Test print")
    

// 2   
    createAlbums()
    setupConstraints()

【问题讨论】:

你需要研究的词是“异步”。 使用完成块。 @ElTomato 函数没有,正如我在线程中所说的 @rmaddy 这是第一部分在第二部分之后的事实吗?谢谢 @NicolòPadovan 是的,albums.append(snapshot.key) 行和它后面的两个 print 行位于 El Tomato 提到的完成块内。 【参考方案1】:

您需要将 createAlbums()setupConstraints() 移动到您正在进行测试的位置打印。

虽然看起来您的代码都发生在一个地方,但实际上并非如此。

花括号之间的这些行...

albums.append(snapshot.key)

print("\(albums)")
print("Test print")

... 是异步发生的,当 firebase 因为它有数据而回调你时。

所以你需要更多这样的东西:

// 1
let ref = Database.database().reference()
var albums: [String] = [String]()

override func viewDidLoad() 
    super.viewDidLoad()
    var createdAlbums = false
    ref.child("Albums").observe(.childAdded)  (snapshot) in
        albums.append(snapshot.key)

        print("\(albums)")
        print("Test print")

        if !createdAlbums 
            // Only run this part once, when we
            // get our first callback from firebase
            self.createAlbums()
            self.setupConstraints()
            createdAlbums = true
        
    

// 2

【讨论】:

【参考方案2】:

其他工作解决方案

在这种情况下,请观察同一引用/查询上的 .value 事件。在您的闭包中,循环遍历子代,如 ***.com/a/27342233 所示,并在循环结束时调用 createAlbums()。

来自 Frank van Puffelen 的评论

【讨论】:

以上是关于ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 查询未按正确顺序执行?

条带 webhook 未按正确顺序传入的错误

wcf 调用完成事件未按正确顺序触发

嵌套 Cloudkit 查询未按正确顺序打印

Eloquent 模型未按正确顺序连接表

优先队列未按正确顺序排序