ViewDidLoad无法以正确的顺序执行操作-Firebase,Swift

时间:2019-03-08 21:38:00

标签: ios swift firebase firebase-realtime-database

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

我想到了两种解决方案:

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

  2. 创建一个Int var并仅在var的值与数据库中“ Albums”的值数相同的情况下运行代码的2部分,因此它将填充本地“相册”数组。

  3. 使用两个不同的函数: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()
}

2 个答案:

答案 0 :(得分:0)

您需要将 createAlbums() setupConstraints() 移至要进行测试的位置打印。

尽管看起来您的代码全部发生在一个地方,但实际上并非如此。

这些花括号之间的线条...

SELECT
log_created as 'date'
COUNT(*) AS 'count',
SUM(log_success) AS 'success'
SUM('count' - 'success') AS 'no_success'
FROM send_log
GROUP BY DATE_FORMAT(log_created, '%Y-%m-%d');

...是异步发生的,当firebase因为有数据而回叫您时。

所以您需要更多类似这样的东西:

albums.append(snapshot.key)

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

答案 1 :(得分:0)

其他工作解决方案

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

摘自Frank van Puffelen的评论