在我的应用程序内部,我似乎遇到了错误。不是运行时错误或错误,而是无法弄清楚如何做某事或在哪里使用它。在我的应用程序的一部分中,用户可以使用swift中的firebase引用将数据发布到我的firebase。另一方面,我遇到困难的是,不仅要读取数据,还要组织它。我在视图控制器上有一个十个UIButton的列表,我试图让它每次使用Firebase的方法.observeEventType(.Value, withBlock: { snapshot in })
更改值以捕获snapshot.value
然后向下转换它作为使用as! String
的字符串然后制作,最新的数据,我的第一个UIButton的标题和我的第二个UIButton的标题是旧的第一个解开按钮的标题等,直到第九名UIButton的头衔是第十名,第十名被忽略。基本上是UIButton标题的一个循环,基于最近发布的十个帖子。任何帮助都会很棒,我希望这有助于其他人!谢谢!以下是对代码的尝试:
override func viewDidLoad() {
super.viewDidLoad()
// firebase reference is defined
// UIButtons deck1 - deck10 are defined
refName.observeEventType(.Value, withBlock: { snapshot in
// however all that happens is that only the first UIButton's title is updated with the new data ( snapshot.value as! String )
self.deck10.titleLabel!.text! = self.deck9.titleLabel!.text! // backwards attempt so values do not overlap
self.deck9.titleLabel!.text! = self.deck8.titleLabel!.text!
self.deck8.titleLabel!.text! = self.deck7.titleLabel!.text!
self.deck7.titleLabel!.text! = self.deck6.titleLabel!.text!
self.deck6.titleLabel!.text! = self.deck5.titleLabel!.text!
self.deck5.titleLabel!.text! = self.deck4.titleLabel!.text!
self.deck4.titleLabel!.text! = self.deck3.titleLabel!.text!
self.deck3.titleLabel!.text! = self.deck2.titleLabel!.text!
self.deck2.titleLabel!.text! = self.deck1.titleLabel!.text!
self.deck1.titleLabel!.text! = snapshot.value as! String
})
}
顺便说一下,用户只是将字符串发布到firebase,但为了安全起见,最好使用snapshot.value as? String
来检查它是否为字符串,否则返回nil。
答案 0 :(得分:1)
我认为这就是你所追求的......
您要做的第一件事是将Firebase中的最后10个(最新)值加载到数组中。该数组将用于填充和维护您的按钮标题。您还希望保留对数组中按钮的引用。其中一些不在我的头顶,所以不要复制粘贴!
var titleArray = [String]()
var buttonArray = [NSButton]() //populate this with 10 button references
titlesRef.queryLimitedToLast(10).observeSingleEventOfType(.Value, withBlock : {
snapshot in
for child in snapshot.children {
let title = child.value["title"] as! String
self.titleArray.append(title)
}
//data will be ascending, newest at the bottom, reverse that
self.titleArray = self.titleArray.reverse()
for index in 0...9
self.buttonArray[index].title = self.titleArray[index] as! String
}
})
然后向您的节点添加一个观察者,它将通知您添加的最新标题。
titlesRef.queryLimitedToLast(1).observeEventType(.ChildAdded, withBlock : {
snapshot in
let title = snapshot.value["title"] as! String
//always add the most current at the 'top' of the array
titleArray(title, atIndex: 0)
//remove the oldest index
titleArray.removeAtIndex(titleArray.count)
//iterate over the buttonsArray and update their titles
})
棘手的一点是,Firebase .Value将按升序排列,这意味着最早的标题将是第一个读入,最新的标题将是最后一个。我们使用.reverse()来反转titlesArray的顺序,以便最新的标题位于顶部。
从那时起,我们观察添加到Firebase的最新标题,读取它并将其插入数组顶部,然后刷新按钮标题,弹出最后一个(最旧的)。
另一个选择是:不是观察添加的最后一个标题并插入它,你可以
titlesRef.queryLimitedToLast(10).observeEventType(.Value...
当最后10个更改将全部读入时。然后您可以迭代(反向!)并更新按钮。这实际上可能是更少的代码,但它正在阅读更多的数据。
编辑:这实际上可能是更好的选择。这是代码
titlesRef.queryLimitedToLast(10).observeEventType(.Value, withBlock : { snapshot in
for child in snapshot.children {
let title = child.value["title"] as! String
titleArray.append(title)
}
titleArray = titleArray.reverse()
for index in 0...9 {
let title = titleArray[index]
self.buttonArray[index].title = titleArray[index]
}
})