Я разрабатываю приложение для iOS с Firebase.Мой контроллер корневого представления - это UITabBarController
.
Все контроллеры в указанном TabBar должны прослушивать User
документ в Firestore Firebase, но создание слушателя в каждом из них не кажетсянаиболее эффективный способ сделать это.
Я знаю, что мог бы создать слушателя в CustomTabBarController
примерно так:
import UIKit
import FirebaseFirestore
class CustomTabBarController: UITabBarController {
var userListener: ListenerRegistration?
var user: User? // User is a custom class
override func viewDidAppear(_ animated: Bool) {
let userID = UserDefaults.standard.value(forKey: "id") as! String
userListener = Firestore.firestore().document("users/\(userID)").addSnapshotListener { (document, error) in
if let document = document {
self.user = User(firebaseDocument: document)
} else {
// handle error!
}
}
}
override func viewDidDisappear(_ animated: Bool) {
if let listener = userListener {
listener.remove()
}
}
}
и затем получить доступ к этому свойству user
из всех ChildViewController
вот так:
class ChildViewController: UIViewController {
var user: User?
override func viewDidLoad() {
super.viewDidLoad()
let customTabBarController = tabBarController as! CustomTabBarController
self.user = customTabBarController.user
}
}
Я обнаружил две проблемы с этим подходом:
- Свойство
user
в ChildViewController
не будет обновляться, так как оно толькоустановить в методе viewDidLoad
. - Я не думаю, что
CustomTabBarController
- это место для обработки ошибки слушателя.Разные ChildViewController
будут по-разному справляться с этим.
Вопросы: Каковы мои варианты создания слушателя, способного обновлять любые UIVIewController
, которыенужен его результат?Нахожусь ли я на правильном пути здесь или, может быть, я могу использовать AppDelegate
или даже Singleton для достижения этой цели.
Спасибо!