質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

4回答

1342閲覧

セマフォがデットロック状態になる

qyoeku

総合スコア25

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/08/18 08:33

編集2019/08/18 08:35

firebaseで認証をしてからアプリを立ち上げたいのですが、セマフォで非同期処理である認証の完了を待とうとするとデッドロック状態になってしまいます。どうしてなのでしょうか?

swift

1 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 2 FirebaseApp.configure() 3 let defaults = UserDefaults.standard 4 defaults.register(defaults: ["firstlaunch":true]) 5 var a = DispatchSemaphore(value: 0) 6 Auth.auth().signInAnonymously { (user, error) in 7 print("ID:a(user)") 8 print(error) 9 a.signal() 10 } 11 a.wait()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

こんにちは。
firebaseの事はわかりませんが、
Auth.auth().signInAnonymouslyが非同期で動作する、かつ完了時の関数がメインスレッドで呼び出されるようであれば、
メインスレッドのキューに処理が追加される→でもメインスレッドはa.waitで止まっているのでその処理が実行されることはない→デッドロック

という状況は有り得そうです。

投稿2019/08/19 00:55

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qyoeku

2019/08/19 05:45

解決策はありますか?
takabosoft

2019/08/19 06:42

考え方を変えてください。メインスレッドを止めない&セマフォを使わなければよいです。
guest

0

swift

1print("ID:a(user)") 2print(error) 3a.signal()

こちらは実行されていることは確認されているでしょうか?

Auth.auth().signInAnonymouslyのクロージャのスレッドが、
a.wait()で待っているスレッドと同じ場合は、クロージャへのスレッドがロックされているために
デッドロックとなります。

swift

1DispatchQueue.global().async { 2Auth.auth().signInAnonymously { (user, error) in 3 print("ID:a(user)") 4 print(error) 5 a.signal() 6 } 7}

などとすると、別スレッドで実行されますので、a.signal()が実行されると思います。

投稿2019/08/19 23:47

k2moons

総合スコア184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ログインの状態を監視するAuthのメソッドaddStateDidChangeListener(_:)を利用してください。

リファレンス

投稿2019/08/20 02:35

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コメントに書くべき内容ですがコメントではコードブロックが使えないので回答として記載させてください。内容としてはtakabosoftさん、k2moonsさんの回答を支持するもので、あくまで補足情報です。

firebase-ios-sdk/Firebase/Auth/Source/Auth/FIRAuth.m を見ると、signInAnonymouslyWithCompletion の処理は最終的に

objc

1dispatch_async(FIRAuthGlobalWorkQueue(), ^{ 2 // かなり中略... 3 dispatch_async(dispatch_get_main_queue(), ^{ 4 callback(nil, error); 5 }); 6}

で返ってきていますので、takabosoftさんが指摘する

Auth.auth().signInAnonymouslyが非同期で動作する、かつ完了時の関数がメインスレッドで呼び出されるようであれば、

は正のようです。
(FIRAuthGlobalWorkQueue の実装は → firebase-ios-sdk/Firebase/Auth/Source/Auth/FIRAuthGlobalWorkQueue.m)

投稿2019/08/20 00:51

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/08/20 02:29

補足ありがとうございます????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問