当我尝试在模拟器上运行以下代码(也在设备上,结果相同)时,我遇到了一个问题:该函数首先执行以下代码的第2部分(注释只是为了一个引用,代码本身完全在viewDidLoad中。为了清楚起见,然后执行第1部分(firebase部分)。我需要先执行ref.child ....函数,因为“ createAlbums”函式需要从我的数据库中提取专辑(因此,完成代码块是完美的,但是该函数不允许我放任何)。
我想到了两种解决方案:
一种添加完成块的方法(请记住ref.child ... func就像一个循环,因此它将为在数据库中找到的每个单个值打印整个“相册”数组。 / p>
创建一个Int var并仅在var的值与数据库中“ Albums”的值数相同的情况下运行代码的2部分,因此它将填充本地“相册”数组。
使用两个不同的函数: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()
}
答案 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的评论