【问题标题】:own completion handler in firebase function (custom class method)firebase 函数中自己的完成处理程序(自定义类方法)
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 漂亮,没想到动态变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 2016-07-24
  • 2019-01-24
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多