TableView перезагружает и добавляет (повторяет) исходные данные каждый раз, когда пользователь подписывает - PullRequest
0 голосов
/ 27 августа 2018

Я столкнулся с проблемой с моим просмотром таблицы при входе через 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
    }

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Ну, я не знаю, почему другие опции, названные выше, не работали, но это то, что я собирался сделать. Я использовал NotificationCenter Я добавил это ниже контроллера вида выхода

NotificationCenter.default.post(name: Notification.Name("clearTable"), object: nil)

И на контроллере представления с таблицей я добавил это внутри ViewDidLoad:

NotificationCenter.default.addObserver(self, selector: #selector(clearTable), name: Notification.Name("clearTable"), object: nil)

и добавили следующую функцию:

@objc func clearTable() {
    items.group.removeAll()
}

Я до сих пор не понимаю, почему размещение items.group.removeAll () перед загрузкой таблицы не сработало. Похоже, почти то же самое.

0 голосов
/ 28 августа 2018

Попробуйте очистить ваш источник данных, прежде чем добавлять что-либо.

func parseJSON(json: JSON) {
    items.group.removeAll()
    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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...