【发布时间】:2016-07-20 11:57:04
【问题描述】:
我想异步更新方法的一些初始化值,但我找不到尊重 firebase 完成的方法,所以我正在尝试自己做一个,但没有运气,有什么想法吗? (在下面的代码中,我正在尝试更新 comlike 的值)
class POSTDATA {
var comcount : String
var comlike : Int
var post : getitems
init(comcount:String, comlike:Int, post:getitems) {
self.post = post
self.comlike = comlike
self.comcount = comcount
findComCount(){success in}
}
func findComCount(completionHandler: (Bool) -> ()) {
let refComCount = Firebase (url: ("https://XXXXXX/COMCOUNTS/" + self.post.postid + "/comcount"))
refComCount.observeEventType(.Value, withBlock: { snap in
if snap.value is NSNull {
self.comcount = "0"
} else {
if snap.value == nil {
self.comcount = "0"
} else {
self.comcount = String( snap.value!)
}
}
completionHandler(true)
})
}
}
【问题讨论】:
-
当 Firebase 返回值时,是什么阻止了块内的值更新?
-
事实上我想稍后在 VC 中使用这个方法,所以我会做一些类似 let data:POSTDATA("0", 0, post) 并且在得到 POSTDATA 值之后,但是由于没有完成,参数返回nil
-
这种设置实际上并没有利用 Firebase 的异步特性,实际上可能会使代码变得比它需要的更复杂。当有新数据时,您应该让 firebase 告诉您的应用程序,然后相应地进行更新。这将消除在多个地方使用该方法的需要,因为数据更新是在一个块中处理的,并且数据将始终有效,因为 firebase 正在处理您的应用程序更新。
-
在一个复杂的应用程序中,firebase 完成处理程序真的很烦人。它很好,健壮且快速,但是它处理自己的异步系统的方式迫使您多次乘以代码,考虑搜索功能和获取选项,搜索将为您提供要观察的 id 列表,而提取将是一个查询。他们都调用完全相同的子获取代码。通过一种方法启动子观察者可以简化全局架构并跟踪观察者。 EzieHammer 的回答非常好,因为它暗示了一个直截了当的排队等候解决方案
-
也许我不明白这个问题,但澄清一下,Firebase 中没有搜索或获取功能。当您希望 firebase 告诉您某个事件或检索特定节点的内容时,您可以添加一个 Observer。当您要查找特定数据时,请查询。一旦你附加了一个观察者,它就会粘住——你不需要复制你的代码。您通常不需要搜索来获取要观察的 id 列表。有时越简单越好,但同样,我可能误解了这个问题。
标签: ios swift asynchronous firebase completionhandler