【问题标题】:Array items are deleted after exiting 'while' loop?退出'while'循环后删除数组项?
【发布时间】:2016-05-02 23:35:36
【问题描述】:

我有一个“while”循环,用于检查 Firebase 菜单上的某些价格。对于每件商品,它会转到特定的参考 URL 并获取该菜品的价格,然后将其值提交给要在表格上显示的数组。

var i = 0
while i < self.itemNames.count {
  itemNameRef.childByAppendingPath("\(self.itemNames[i])/itemPrice").observeEventType(.Value, withBlock: {
    snapshot in
    self.itemPrices.append(snapshot.value as! String)
  })
  i++
}

事情是,一旦它退出 observeEventType 外壳,它似乎会清除我的整个数组。我在整个循环中放置了一些 print() 语句,发现如果语句直接位于附加代码下方但在 } 之外,我可以让它打印数组,因为它附加,但它只返回一个空数组。

这里发生了什么?谢谢!

【问题讨论】:

  • 你真的应该在那里使用for itemName in itemNames

标签: ios arrays swift while-loop firebase


【解决方案1】:

observeEventType 方法有什么作用?

从它以块/闭包作为参数的事实来看,它向我暗示它是一个异步函数(一个在后台线程上启动长时间运行的任务,然后在后台任务之前立即返回的函数完成。最后,它在长时间运行的任务完成时调用完成块/闭包。)

类比:

你是一名大学教授。你把一堆试卷递给你的助教,然后说“请给这些试卷评分,完成后将成绩输入电脑。”

如果当您的助手走向空教室开始为考试评分时,您登录您的系统并查看考试成绩,这些成绩会被输入吗?当然不是。小助理还没坐下呢!

“为这些考试评分”是一项长期任务。 “完成后将它们输入计算机”是完成块/关闭。

如果你调用一个异步函数,那么在下一行,寻找结果,他们不会在那里。

您必须将任务完成后运行的代码放入完成块/闭包中(Objective-C 将它们称为块。Swift 将它们称为闭包。其他语言将它们称为 lambda 或匿名函数。)

【讨论】:

  • 我想我还是很困惑。当我将打印语句直接放在附加代码下方时,它会打印包含正确数据的数组。只是在退出循环的时候,它似乎实际上清除了已经存在的数据。
猜你喜欢
  • 2013-03-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2019-03-19
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多