2016-04-12 26 views
-1

私はFirebaseのバックエンドを持つSwift iOSアプリを持っています。最初のビューコントローラが表示される前にユーザーデータを取得するAppDelegateのロジックを実装しようとしていますが、私が知っている限り、データを取得する唯一の方法は非同期のobserveEventType関数です。問題は、UIの多くにユーザー情報が設定されている必要があるため、ユーザー情報を取得する前にAppDelegate didFinishLaunchingWithOptionsの機能を完了させたくないということです。誰でも私の問題を解決する方法を知っていますか?Firebase(Swift)から同期的にデータを取得する方法はありますか?

編集:

セッションのアイデアは私の問題を解決しませんか?意味は、ユーザーが一度ログインした場合、セッションが永久に(ログアウトしない限り)アクティブなのですが、その場合は同期のauthData機能を使用できますか?

+1

同期アプローチを使用すると、アプリ全体がハングアップしてしまい、ユーザーエクスペリエンスが悪くなります。 UIActivityViewなどのデータがロードされていることをユーザーに示し、データがロードされたらインターフェースをリフレッシュする方が良いでしょう。 – Paulw11

+0

ありがとうございます。あなたがコメントしている間に私が編集をしていたと私は実際に信じています、あなたは編集で質問された質問に答えることができるでしょうか? @ Paulw11 – rigdonmr

+0

あなたの質問のタイトルを確認してください。質問している内容が不明です。ここでは複数の質問をしているようですが、書いていないことを覚えておく必要があります。 – xpereta

答えて

0

他のさまざまなオプションがあるためdidFinishLaunchingWithOptionsが使用されている理由がわからないので、コードを投稿していません。

単純な例では、ストーリーボードを使用して、ストーリーボード上のエントリポイントとしてログインビューコントローラを作成します。その後、そのビューコントローラでユーザーのログインメールとパスワードを取得し、認証してアプリケーションのフローを継続します。

ref.authUser(userName, password: password) { error, authData in 

     if error != nil { 
      print("No auth for you, two weeks") 
     } else { 
      print("authenticated as \(authData.uid)") 

      //now set up your app, populate user info etc. 
      // even calling back to the delegate would work. 

     } 
    } 
+0

しかし、 'authData'は非同期であるため、完了ブロックが終了する前にUIをロードできないため、多くのUIコンポーネントがnilデータで初期化されます。 – rigdonmr

+0

@rigdonmr正確ではありません。ユーザーを認証する前に、UIロードの一部のコンポーネントが必要な場合があります。たとえば、電子メールとパスワードを取得してref.authUserブロックに渡すログイン画面。ブロックが実行されるまで、他のUI要素はロードされません。そうすれば、Firebaseがデータを返すまで、非同期で動作し、データに作用しないことが保証されます。 – Jay

関連する問題