Ios firebase函数中自己的完成处理程序(自定义类方法)
我想异步更新一个方法的一些init值,但是我没有找到一种尊重firebase完成的方法,所以我尝试自己做一个,但是运气不好,有什么想法吗?(在下面的代码中,我尝试更新comlike的值)Ios firebase函数中自己的完成处理程序(自定义类方法),ios,swift,asynchronous,firebase,completionhandler,Ios,Swift,Asynchronous,Firebase,Completionhandler,我想异步更新一个方法的一些init值,但是我没有找到一种尊重firebase完成的方法,所以我尝试自己做一个,但是运气不好,有什么想法吗?(在下面的代码中,我尝试更新comlike的值) }在init调用中执行异步操作非常奇怪,相反,您可以使用动态变量和KVO: class POSTDATA:NSObject { //Inherit your class from NSObject to allow KVO observing var comcount : String
}在init调用中执行异步操作非常奇怪,相反,您可以使用动态变量和KVO:
class POSTDATA:NSObject { //Inherit your class from NSObject to allow KVO observing
var comcount : String
var comlike : Int
var post : getitems
dynamic var completed:Bool = false //Here you declare your dynamic var
init(comcount:String, comlike:Int, post:getitems) {
self.post = post
self.comlike = comlike
self.comcount = comcount
findComCount();
}
func findComCount() {
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!)
}
}
self.completed = true //Assign to it value 'true' when update i completed
})
}
}
然后在viewController中执行以下操作:
var postDataObject:POSTDATA = POSTDATA("String",0,getitemObj);
override viewDidLoad() {
super.viewDidLoad()
postDataObject.addObserver(self, forKeyPath: "completed", options: NSKeyValueObservingOption, context: nil)
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if (keyPath != nil){
if(keyPath!=="completed"){
//HERE YOU KNOW YOUR OBJECT HAS BEEN UPDATED
}
}
}
deinit {
postDataObject.removeObserver(self, forKeyPath: "completed", context: nil)
}
var postDataObject:POSTDATA=POSTDATA(“字符串”,0,getitemObj);
覆盖viewDidLoad(){
super.viewDidLoad()
addObserver(self,forKeyPath:“已完成”,选项:NSKeyValueObservingOption,上下文:nil)
}
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
if(键路径!=nil){
如果(关键路径!=“已完成”){
//在这里,您知道您的对象已更新
}
}
}
脱硝{
removeObserver(self,forKeyPath:“已完成”,上下文:nil)
}
在init调用中执行异步操作非常奇怪,相反,您可以使用动态变量和KVO:
class POSTDATA:NSObject { //Inherit your class from NSObject to allow KVO observing
var comcount : String
var comlike : Int
var post : getitems
dynamic var completed:Bool = false //Here you declare your dynamic var
init(comcount:String, comlike:Int, post:getitems) {
self.post = post
self.comlike = comlike
self.comcount = comcount
findComCount();
}
func findComCount() {
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!)
}
}
self.completed = true //Assign to it value 'true' when update i completed
})
}
}
然后在viewController中执行以下操作:
var postDataObject:POSTDATA = POSTDATA("String",0,getitemObj);
override viewDidLoad() {
super.viewDidLoad()
postDataObject.addObserver(self, forKeyPath: "completed", options: NSKeyValueObservingOption, context: nil)
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if (keyPath != nil){
if(keyPath!=="completed"){
//HERE YOU KNOW YOUR OBJECT HAS BEEN UPDATED
}
}
}
deinit {
postDataObject.removeObserver(self, forKeyPath: "completed", context: nil)
}
var postDataObject:POSTDATA=POSTDATA(“字符串”,0,getitemObj);
覆盖viewDidLoad(){
super.viewDidLoad()
addObserver(self,forKeyPath:“已完成”,选项:NSKeyValueObservingOption,上下文:nil)
}
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
if(键路径!=nil){
如果(关键路径!=“已完成”){
//在这里,您知道您的对象已更新
}
}
}
脱硝{
removeObserver(self,forKeyPath:“已完成”,上下文:nil)
}
当Firebase返回值时,是什么阻止了这些值在块内被更新?事实上,我想稍后在VC中使用这种方法,所以我会做一些类似于let data:POSTDATA(“0”,0,post)的事情,然后立即获取POSTDATA值,但由于没有完成,参数返回:此设置实际上没有利用Firebases异步特性,并且可能会使代码变得比需要的更复杂。当有新数据时,您应该让firebase告诉您的应用程序,然后进行相应的更新。这将消除在多个位置使用该方法的需要,因为数据更新在一个块中处理,并且数据始终有效,因为firebase正在处理更新您的应用程序。在复杂的应用程序中,firebase完成处理程序非常烦人。它是好的、健壮的和快速的,但是它处理自己的异步系统的方式迫使您将代码乘以多次,考虑一个搜索函数和一个抓取选项,搜索将为您提供一个要观察的ID列表,而抓取将是一个查询。它们都调用完全相同的子获取代码。通过一种方法初始化子观察器简化了全局体系结构并跟踪OBerver。EzieHammer的回答非常好,因为它暗示了一个straighforward在排队等待解决方案。也许我不理解这个问题,但请澄清,Firebase中没有搜索或获取功能。当您希望firebase告诉您一个事件或检索特定节点的内容时,您可以添加一个观察者。当您要查找特定数据时,请单击“查询”。一旦你附加了一个观察者,它就会粘住——你不需要复制你的代码。您通常不需要搜索来获取要观察的id列表。有时更简单更好,但我可能误解了这个问题。当Firebase返回值时,是什么阻止了值在块内被更新?事实上,我想稍后在VC中使用此方法,所以我会做一些类似于让数据:POSTDATA(“0”,0,post),然后在获取POSTDATA值之后,但是由于没有完成,参数返回nil。此设置实际上没有利用Firebases异步特性,并且可能实际上使代码比需要的更复杂。当有新数据时,您应该让firebase告诉您的应用程序,然后进行相应的更新。这将消除在多个位置使用该方法的需要,因为数据更新在一个块中处理,并且数据始终有效,因为firebase正在处理更新您的应用程序。在复杂的应用程序中,firebase完成处理程序非常烦人。它是好的、健壮的和快速的,但是它处理自己的异步系统的方式迫使您将代码乘以多次,考虑一个搜索函数和一个抓取选项,搜索将为您提供一个要观察的ID列表,而抓取将是一个查询。它们都调用完全相同的子获取代码。通过一种方法初始化子观察器简化了全局体系结构并跟踪OBerver。EzieHammer的回答非常好,因为它暗示了一个straighforward在排队等待解决方案。也许我不理解这个问题,但请澄清,Firebase中没有搜索或获取功能。当您希望firebase告诉您一个事件或检索特定节点的内容时,您可以添加一个观察者。当您要查找特定数据时,请单击“查询”。一旦你附加了一个观察者,它就会粘住——你不需要复制你的代码。您通常不需要搜索来获取要观察的id列表。有时简单更好,但我可能误解了这个问题。beautifull,没有想到动态变量beautifull,没有想到动态变量