2017-04-19 7 views
2

:このVCから同期データを再度

ref.child("posts").observe(.childChanged, with: { (snapshot) in 
    .......     
}) 

私は「存在すると設定されているVC2を入力することができます私の後編では「モーダル」です。

今、VC1からVC2にライブFBデータを渡すことができますか?私はsegue.identifierを使用し、次のVCにセグをするときにデータを渡すことができることを知っていますが、これは1回限りですのみを送信してください。または、vc1からvc2へデータをフェッチするデリゲートをセットアップする必要がありますか?

ノードが更新されたらVC1からVC2にデータを送信する方法はありますか?VC2に新しい.observe()機能を設定する必要がありますか?

+0

シングルトンについて読んで、あなたの問題を解決するためにそれについて考えるようお願いします:) –

+0

@AchrefGassoumi確かに、あなたが提案できるリソースはありますか? – user2722667

+0

私はこれがあなたが必要としていると思う https://krakendev.io/blog/the-right-way-to-write-a-singleton 、あなたがあなたの問題を解決した場合私はあなたの答えを見てみたい場合は残してくださいコメントと私は後で答えを投稿する(今私はそれを行うことはできません、申し訳ありません) また、これをお読みください https://www.raywenderlich.com/86477/introducing-ios-design-patterns-in- swift-part-1 –

答えて

2

まず私はシングルトンデザインパターについてあなたを思い出させるしたいと思います:ソフトウェア工学で を、シングルトンパターンは、つのオブジェクトにクラスのインスタンス化を制限デザインパターンです。これは、システム全体での操作をにするために、1つのオブジェクトが必要な場合に便利です。

最初にする必要があるのは、firebaseから取得したデータをパラメータとして含む呼び出しを作成することです。ログインしたときにユーザーデータを取得するには、次のようにします。その後、私のアプリと 私のユーザークラスがこのようなものです(私はこれは絶対に間違ったアプローチであるVCとの間でデータを渡すする意図を持っていない)私のアプリケーションのすべての部分では、これらのデータを使用します。後

import Foundation 
class User { 

    static let sharedInstance = User() 

    var uid: String! 
    var username: String! 
    var firstname: String! 
    var lastname: String! 
    var profilePictureData: Data! 
    var email: String! 
} 

別のクラスのFirebaseUserManagerを作成しました(あなたのView Controllerでこれを行うことができますが、今後のアップデートを容易にするために、あなたのコントローラとあなたのモデルのビューを分離することは常に評価されています)あなたや他の開発者のための)のために は、だから私のfirebaseUserManagerクラスは、この

import Foundation 
    import Firebase 
    import FirebaseStorage 
    protocol FirebaseSignInUserManagerDelegate: class { 
     func signInSuccessForUser(_ user: FIRUser) 
     func signInUserFailedWithError(_ description: String) 
    } 
    class FirebaseUserManager { 
    weak var firebaseSignInUserManagerDelegate: FirebaseSignInUserManagerDelegate! 
func signInWith(_ mail: String, password: String) { 

     FIRAuth.auth()?.signIn(withEmail: mail, password: password) { (user, error) in 
      if let error = error { 

       self.firebaseSignInUserManagerDelegate.signInUserFailedWithError(error.localizedDescription) 

       return 
      } 

      self.fechProfileInformation(user!) 
     } 
    }   

func fechProfileInformation(_ user: FIRUser) { 

      var ref: FIRDatabaseReference! 
      ref = FIRDatabase.database().reference() 

      let currentUid = user.uid 

      ref.child("users").queryOrderedByKey().queryEqual(toValue: currentUid).observeSingleEvent(of: .value, with: { snapshot in 

       if snapshot.exists() { 

        let dict = snapshot.value! as! NSDictionary 

        let currentUserData = dict[currentUid] as! NSDictionary 

        let singletonUser = User.sharedInstance 
        singletonUser.uid = currentUid 
        singletonUser.email = currentUserData["email"] as! String 
        singletonUser.firstname = currentUserData["firstname"] as! String 
        singletonUser.lastname = currentUserData["lastname"] as! String 
        singletonUser.username = currentUserData["username"] as! String 

        let storage = FIRStorage.storage() 
        let storageref = storage.reference(forURL: "gs://versus-a107c.appspot.com") 
        let imageref = storageref.child("images") 
        let userid : String = (user.uid) 
        let spaceref = imageref.child("\(userid).jpg") 

        spaceref.data(withMaxSize: 1 * 1024 * 1024) { data, error in 
         if let error = error { 
          // Uh-oh, an error occurred! 
          print(error.localizedDescription) 
         } else { 

          singletonUser.profilePictureData = data! 

          print(user) 

          self.firebaseSignInUserManagerDelegate.signInSuccessForUser(user) 
         } 
        } 
       } 
      }) 
     } 
    } 

のようなものが含まれていますので、基本的に、このクラスには、ユーザーを取得すること、いくつかの私たちが実装しますプロトコルとマネージャーfirebaseサインインしてfechProfileInformation二つの機能が含まれています情報私は、以下のなかった私のログインビューコントローラに比べ

: ログインbuttoで1プロトコルを実装

class LoginViewController: UIViewController, FirebaseSignInUserManagerDelegate 

2 nは私がやったプロトコルメソッドを実装

@IBAction func loginAction(_ sender: UIButton) { 



     guard let email = emailTextField.text, let password = passwordTextField.text else { return } 

     let firebaseUserManager = FirebaseUserManager() 
     firebaseUserManager.firebaseSignInUserManagerDelegate = self 

     firebaseUserManager.signInWith(email, password: password) 
    } 

3次のボタンで記号をユーザーがクリックがあったときに、今{

// Do something example navigate to the Main Menu 
} 

func signInUserFailedWithError(_ description: String) { 
    // Do something : example alert the user 
} 

: FUNCのsignInSuccessForUser(FIRUser _ユーザー)オブジェクトが作成されたオブジェクトがfirebaseデータベースに保存されています

あなたの質問の答え:どのようにアプリケーションのどこにユーザデータを取得するのですか

私のアプリのすべての部分で

私は

print(User.sharedInstance.uid) or print(User.sharedInstance. username) 

を作ることができて、私は私がしたい値を取得します。

PS:シングルトンを適切に使用するには、インスタンス化時にオブジェクトを呼び出す必要があります。