# #swift #firebase-realtime-database #firebase-authentication
Вопрос:
Я попытался создать экран, на котором выводится метка имени пользователя пользователя. Это код, который я написал:
// ViewController.swift
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import SwiftUI
class HomeViewController: UIViewController {
override func viewDidLoad()
{
super.viewDidLoad()
guard let uid = Auth.auth().currentUser?.uid else { return }
guard (Auth.auth().currentUser?.uid) != nil else {return}
Database.database().reference().child("users").child(uid).child("username").observeSingleEvent(of: .value){ (snapshot) in
guard let username = snapshot.value as? String else {return}
let label = UILabel(frame: CGRect(origin: .zero, size: CGSize(width: 100, height: 100)))
label.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY)
label.textAlignment = NSTextAlignment.center
label.text = username
self.view.addSubview(label)
}
}
}
Однако текст возвращается как ничто. Есть ли что-то, что я делаю неправильно или упускаю из виду? Когда я удаляю части кода firebase и просто добавляю случайный фрагмент текста вместо «имя пользователя», тогда появится надпись с этим текстом, поэтому я предполагаю, что с кодом firebase что-то не так.
Комментарии:
1. С этим кодом есть много основных проблем: во-первых, этот код использует UIKit, а не SwiftUI. Во-вторых, все операции пользовательского интерфейса должны выполняться в основном потоке, поэтому oyu должен переносить строки между
let label...
до конца обратного вызова в основной поток сDispatchQueue.main.asynch { ... }
помощью блока. Наконец, вам необходимо выполнить отладку, если проблема связана с меткой илиguard let username = snapshot.value as? String else {return}
завершается ли оператор, и в этом случае вам нужно понять, почему ничего не возвращается, а не почему метка не установлена2. № 1. Узнайте, для чего
viewDidLoad
. № 2. Запустите поиск асинхронного процесса. № 3. Используйте основной поток при работе с пользовательским интерфейсом, как предлагает Кирилл С.