Я столкнулся с проблемой с моим просмотром таблицы при входе через Firebase в моем приложении iOS. Таблица загружает содержимое из фида сына. При первом входе в систему таблица загружается нормально, но при выходе и повторном входе таблица перезагружает все данные, добавляя исходные данные к содержимому таблицы. Я попытался проверить, была ли таблица пустой перед перезагрузкой, но не имела никакого эффекта.
Закрытие приложения не имеет проблем. Проблема возникает только в том случае, если пользователь выходит из приложения с помощью кнопки подписи в контроллере представления учетной записи и снова входит в систему. Я хотел бы выяснить, что заставляет таблицу добавлять в нее те же данные или, возможно, очищать таблицу, когда пользователь выходит из системы, но не может понять ни того, ни другого.
Это код для загрузки функции. Я поместил этот код в viewWillAppear или viewDidLoad, но без разницы.
if tableView.visibleCells.isEmpty {
loadTableData()
} else {
//do something
}
Это моя функция загрузки данных
func loadTableData() {
let url = "https://JSONurl.json"
let headers: HTTPHeaders = [
"X-API-Key": api.key,
"Accept": "application/json"
]
Alamofire.request(url, headers: headers).validate().responseJSON { response in
switch response.result {
case .success:
if let value = response.result.value {
let json = JSON(value)
self.parseJSON(json: json)
self.tableView.reloadData()
}
case .failure(let error):
let alert = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "title", style: UIAlertActionStyle.default, handler: nil)
alert.addAction(okAction)
self.present(alert, animated: true, completion: nil)
print(error)
}
}
}
В моем контроллере представления подписи я аутентифицирую пользователя с помощью следующего кода
func authenticateUser() {
guard let userEmailAddress = userEmailAddressTextField.text, !userEmailAddress.isEmpty else {
// alert error message
return
}
guard let userPassword = userPasswordTextField.text, !userPassword.isEmpty else {
// alert error message
return
}
Auth.auth().signIn(withEmail: userEmailAddress, password: userPassword) {
(user, error) in
if let error = error {
self.commonFunctions.showAlertMessage(viewController: self, alertTitle: AppConstants.AlertMessages.firebaseAuthErrorTitle, messageToDisplay: error.localizedDescription)
return
}
if user != nil {
let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "viewControllerWithTable") as! UITabBarController
self.present(mainPage, animated: true, completion: nil)
}
}
}
Это мой код в AppDelegate внутри функции didFinishLaunchingWithOptions. Это так, чтобы пользователю не пришлось снова входить в систему при закрытии приложения.
if Auth.auth().currentUser != nil && Auth.auth().currentUser!.isEmailVerified {
let mainStoryBoard: UIStoryboard = UIStoryboard(name:"Main", bundle:nil)
let nextView: UITabBarController = mainStoryBoard.instantiateViewController(withIdentifier: "viewControllerWithTable") as! UITabBarController
self.window?.rootViewController = nextView
}
Мой parseJSON выглядит следующим образом:
func parseJSON(json: JSON) {
for item in json["results"][0]["members"].arrayValue {
item.id = (item["id"].stringValue)
// omitted extra data
let eachItem = ItemInit(id: item.id!)
items.group.append(eachItem)
}
sortData()
utils.hideActivityIndicator()
}
Мой выход из системы находится внутри IBAction, когда пользователь нажимает кнопку. Я отправляю пользователя обратно в WelcomeViewController, где пользователь может выбрать способ повторной регистрации (электронная почта, социальные сети).
do {
try Auth.auth().signOut()
let nextView = self.storyboard?.instantiateViewController(withIdentifier: "WelcomeViewController") as! WelcomeViewController
let appDelegate = UIApplication.shared.delegate
appDelegate?.window??.rootViewController = nextView
} catch{
// alert user
}