現在firebaseを使ってアプリを作っています。
ふと、マルチスレッド、非同期処理、などについて勉強していたのですが
swift
1 2 private func fetchUserinfoFromFirebase(){ 3 Firestore.firestore().collection("users").getDocuments{(snapshots, err) in 4 if let err = err { 5 print("user情報の取得に失敗しました(err)") 6 return 7 } 8 snapshots?.documents.forEach{(snapshot) in 9 let dic = snapshot.data() 10 let user = User(dic:dic) 11 user.uid = snapshot.documentID 12 13 guard let uid = Auth.auth().currentUser?.uid else { return } 14 if uid == snapshot.documentID { 15 return 16 } 17 self.users.append(user) 18 } 19 print(Thread.isMainThread) 20 self.usersCollectionView.reloadData() 21 } 22 } 23
単純なfirestoreからデータを引っ張ってくるプログラムですが
ある本で通信などの処理はサブスレッドの非同期処理で行われていると書いてありました。
このプログラムでgetDocumentsの後のコールバック関数内の処理はサブスレッドで行われていると思い
print(Thread.isMainThread)で確認したところtrueと表示されました。
メインスレッドUIに関する処理に使われるべきですし、本来であれば、サブスレッドを使い、非同期で処理を行い、データを取得できた地点で
DispatchQueue.main.asysc{ self.usersCollectionView.reloadData() }
などと書いてメインスレッドに非同期処理でUIを更新するのが理想だと思うのですがなぜtrueと表示されるのでしょうか。
あなたの回答
tips
プレビュー