ios - 在 firebase 函数中拥有自己的完成处理程序(自定义类方法)

标签 ios swift asynchronous firebase completionhandler

我想异步更新方法的一些初始值,但我找不到尊重 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)
    })

}

最佳答案

在 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)
    }

关于ios - 在 firebase 函数中拥有自己的完成处理程序(自定义类方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36343415/

相关文章:

javascript - jQuery ajax 异步 'true' 让我的网络应用程序卡住,直到数据返回

javascript - Ajax异步响应未加载到div中

ios - 属性(property)不保值

android - 如何使用单个导航文件将 Drawer Navigator 包含在 Tab Navigator 中的 Stack Navigator 中

swift - UIButton 边框功能仅返回白色边框

ios - 通过应用程序委托(delegate)从 TableView Controller 更改单元格内的值

objective-c - 返回零长度数据的 NSURLConnection

ios - 触发从表格单元格到另一页的 Segue

iphone - 配置 UIImagePickerController 的帧大小

swift - 无法确定 URL 是否由文件提供程序管理