Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios firebase函数中自己的完成处理程序(自定义类方法)_Ios_Swift_Asynchronous_Firebase_Completionhandler - Fatal编程技术网

Ios firebase函数中自己的完成处理程序(自定义类方法)

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值,但是我没有找到一种尊重firebase完成的方法,所以我尝试自己做一个,但是运气不好,有什么想法吗?(在下面的代码中,我尝试更新comlike的值)


}

在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,没有想到动态变量