2017-03-19 10 views
0

Firebaseに送信する情報があります。データを送信したいのですが、そこから最初にデータを取得する必要があります。取得するデータは、ユーザーの入力に基づいています。Swift iOS - ビューの変更後にFirebaseにデータを送信するために使用するviewControllerライフサイクルイベント

Firebaseにいくつかのネストされた非同期呼び出しを既に行っています。データが設定されていることを確認するためにコールが完了するのを待つだけでなく、シーンを離れてデータを取得してバックグラウンドで変更することができるようにするために、仕事。

私はNSNotificationを使用することを考えていましたが、performSegueWithIdentifierがトリガーされた後です。 notificationobserverは、viewWillDisappearの内部になります。

これは安全ですか?そうでない場合は、何が最良の方法ですか?

コード:

var ref: FIRDatabaseReference! 
let uid = FIRAuth.auth()?.currentUser?.uid 
let activityIndicator = UIActivityIndicatorView() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.ref = FIRDatabase.database().reference().child(self.uid!) 
} 

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(fetchSomeValueFromFBThenUpdateAndResendAnotherValue), name: "FbFetchAndSend", object: nil) 
} 

@IBAction func buttonPressed(sender: UIButton) { 
    activityIndicator.startAnimating() 
    levelTwoRef //send levelTwo data to FB run 1st callback 
     scoreRef //send score data to FB run 2nd callback 
      powerRef //send power data to FB run 3rd callback 
       lifeRef //send life data to FB run Last callback for dispatch_async... 

        dispatch_async(dispatch_get_main_queue()){ 
         activityIndicator.stopAnimating() 
         performSegueWithIdentifier.... 
         //Notifier fires after performSegue??? 
         NSNotificationCenter.defaultCenter().postNotificationName("FbFetchAndSend", object: nil) 
        } 
} 

func fetchSomeValueFromFBThenUpdateAndResendAnotherValue(){ 

    let paymentRef = ref.child("paymentNode") 
    paymentRef?.observeSingleEventOfType(.Value, withBlock: { 
     (snapshot) in 
     if snapshot.exists(){ 
      if let dict = snapshot.value as? [String:AnyObject]{ 
      let paymentAmount = dict["paymentAmount"] as? String 

      let updatePayment = [String:AnyObject]() 
      updatePayment.updateValue(paymentAmount, forKey: "paymentMade") 

      let updateRef = self.ref.child("updatedNode") 
      updateRef?.updateChildValues(updatePayments) 
} 

答えて

1

あなたはviewWillDisappearにオブザーバを追加している、だからあなたのセグエが行われた場合、それは存在しませんので、それは解雇ではないでしょう。

observerをviewDidLoadに追加すると機能します。

しかし、ビューが消えているときにfetchSomeValueFromFBThenUpdateAndResendAnotherValue()を呼び出すだけなら、オブザーバは必要ありません。

単にこのようviewWillDisappear上のメソッドを呼び出す -

override func viewWillDisappear(animated: Bool) 
{ 
    super.viewWillDisappear(animated) 
    fetchSomeValueFromFBThenUpdateAndResendAnotherValue() 
} 
関連する問題