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的主要内容,如果未能解决你的问题,请参考以下文章