Таким образом, мой контроллер вида, а именно «HomeViewController», в основном отображает метку и две кнопки, connect и logout .
После просмотразагружен, мой ярлык в основном имеет цвет фона белый и текст, который говорит "Нажмите кнопку подключения" . Когда я нажимаю кнопку connect , метка меняет текст на «Пожалуйста, подождите, ожидайте соединения с кем-то» , а цвет фона меняется на желтый . Затем я выполняю некоторые запросы Firebase и связываю пользователя с кем-то. После подключения я меняю цвет метки на зеленый и текст на «Вы уже подключены» .
Все работает просто отлично, за исключением того, что у меня есть две проблемы:
Когда загружается представление, я вызываю функцию fetchUserDet()
, которая выбирает данные пользователя и сохраняет их в объявленном объекте User
. Я использую этот объект User
для доступа к сведениям о текущем вошедшем в систему пользователе, таких как имя, возраст и т. Д. Однако, когда я выхожу из системы и захожу как другой пользователь, объекту User
просто не удается получить сведения о недавно зарегистрированном пользователе. in user и возвращает nil.
Временное исправление: я снова вызываю функцию fetchUserDet()
в функции viewWillAppear()
, но я полагаю, что это плохая практика, но она выполняет свою работу. Теперь мой User
объект назначен вновь вошедшему в систему пользователю
Скажем, я нажимаю кнопку подключения, метка меняет цвет и текст, как и ожидалось, но когда я выхожу из системы и захожукак другой пользователь, метка и текст остаются в том же состоянии, что и для предыдущего пользователя. Пример: Вы вошли как пользователь 1 и нажмите кнопку connect , ярлык меняет цвет на желтый и текст на "Пожалуйста, подождите, ожидайте соединения с вамикто-то ". Когда я выхожу и регистрируюсь как пользователь 2 , он остается в том же состоянии, что и желтый и «Пожалуйста, подождите, ожидая соединения с кем-то» *
Я предполагаю, что обе эти ошибки взаимосвязаны, и я определенно делаю что-то здесь не так. Я использую Firestore . Вот код для вашего понимания.
import Firebase
import FirebaseFirestore
import ProgressHUD
class HomeController: UIViewController {
// MARK: Initialize
override func viewWillAppear(_ animated: Bool) {
fetchUserDet()
}
var currentUser: User!
var connected: Bool? {
didSet{
print("Step 7 - Connection has been established at didset")
self.connectionLabel.backgroundColor = .green
self.connectionLabel.text = "You are now connected. Start texting"
}
}
let connectionLabel: UILabel = {
let label = UILabel()
label.text = "Press the connect button for a new connection"
label.textColor = .white
label.backgroundColor = .black
label.textAlignment = .center
return label
}()
let signoutButton: UIButton = {
let button = UIButton()
button.setTitle("Logout", for: .normal)
button.backgroundColor = .red
button.addTarget(self, action: #selector(handleSignout), for: .touchUpInside)
return button
}()
let connectButton: UIButton = {
let button = UIButton()
button.setTitle("Connect", for: .normal)
button.setTitleColor(.red, for: .normal)
button.backgroundColor = .white
button.addTarget(self, action: #selector(handleConnect), for: .touchUpInside)
return button
}()
// MARK: View Did Load
override func viewDidLoad() {
super.viewDidLoad()
fetchUserDet()
}
// MARK: Signout
@objc func handleSignout(){
do {
try Auth.auth().signOut()
let navController = UINavigationController(rootViewController: LoginController())
navController.modalPresentationStyle = .fullScreen
self.present(navController, animated: true, completion: nil)
} catch let error {
print("Failed to signout", error.localizedDescription)
}
}
// MARK: Connection Handle
@objc func handleConnect(){
self.connectionLabel.text = "Please wait, finding you a match..."
self.connectionLabel.textColor = .black
self.connectionLabel.backgroundColor = .yellow
self.connectButton.isEnabled = false
self.connectButton.backgroundColor = .black
Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(handleTime), userInfo: nil, repeats: false)
guard let cUid = Auth.auth().currentUser?.uid else {return}
let gender = currentUser.gender!
//Connection Operation : This function does the connection work
connections(gender: gender, cUid: cUid)
}
// MARK: Connection Algorithm
connections(gender: String. cUid: String) {
//Perform the database connections and algorithm
//If connection is established, I set the isConnected variable to true
self.connected = true
}
@objc func handleTime() {
self.connectButton.isEnabled = true
self.connectButton.backgroundColor = .white
}
// MARK: Authenticate / Views
fileprivate func fetchUserDet(){
if Auth.auth().currentUser == nil {
DispatchQueue.main.async {
let navController = UINavigationController(rootViewController: LoginController())
navController.modalPresentationStyle = .fullScreen
self.present(navController, animated: true, completion: nil)
}
} else {
configureViewComponents()
configureUserDetails()
}
}
// MARK: Configure Components
func configureViewComponents(){
view.backgroundColor = .black
let stackView = UIStackView(arrangedSubviews: [connectionLabel, signoutButton,
connectButton])
stackView.distribution = .fillEqually
stackView.axis = .vertical
view.addSubview(stackView)
stackView.anchor(top: view.topAnchor, leading: view.leadingAnchor, bottom:
view.bottomAnchor, trailing: view.trailingAnchor, padding: .init(top: 20, left: 0,
bottom: 20, right: 0))
}
// MARK: Configure User Details
func configureUserDetails(){
guard let cUid = Auth.auth().currentUser?.uid else {return}
Firestore.firestore().collection("users").document(cUid).getDocument { (snapshot, error)
in
if let error = error {
print("There was an error fetching the current user details ", error.localizedDescription)
return
}
let dictionary = snapshot?.data()
self.currentUser = User(dictionary: (dictionary)!)
print(self.currentUser!)
print("Step 1 Gender")
print(self.currentUser.gender!)
}
}
}