2016-03-31 12 views
1

メソッドの一部のinit値を非同期に更新したいのですが、firebase補完を尊重する方法が見つからないので、自分自身で補完しようとしています、しかし、運がない、任意のアイデア?代わりにあなたが観察動的変数とKVOのようなものを使用することができ、初期化コールで非同期操作を行うfirebase関数の独自の補完ハンドラ(カスタムクラスメソッド)

+0

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にあなたはこのような何かをFirebaseがそれらを返すときに値がブロック内で更新されないようにしますか? – Jay

+0

実際、VCでこのメソッドを使用したいので、POSTDATA( "0"、0、post)とPOSTDATA値を取得した直後のデータをlet let dataのように処理しますが、パラメータreturn nil –

+0

この設定は実際にはFirebasesの非同期性を利用しておらず、実際にコードを必要以上に複雑にする可能性があります。新しいデータがあるときにfirebaseにアプリに通知し、それに応じて更新する必要があります。これにより、データの更新が1つのブロックで処理され、firebaseがあなたのアプリケーションの更新を処理しているので、データは常に有効になるので、複数の場所でメソッドを使用する必要がなくなります。複雑なアプリケーションで – Jay

答えて

0

は非常に奇妙である

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

} 

}(次のコードでは、私はcomlikeの値を更新しようとしています) :何

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) 
    } 
+0

beautifull、 –

関連する問題