UITableView начало / конец обновления падает на другой tableView - PullRequest
0 голосов
/ 19 июня 2019

Мой проект имеет mainFeed tableViewController, и если я выбираю какую-либо строку, он открывает другой tableViewController с другим количеством строк. Внутри secondTableViewController после таймера 1,0 сек я вызываю цепочку beginUpdates, endUpdates, и если я продолжаю оставаться в secondTableViewVC, все в порядке, обновление успешно завершается. Но если после окончания таймера начинается цепочка обновлений (это занимает некоторое время), и если пользователь нажимает «назад» при навигации, чтобы вернуться к mainFeed tableViewController, пока цепочка еще не завершилась, а затем обновления начала / конца цепочки заканчиваются из secondVC, когда он уже закрыт и у меня в настоящее время в mainVC вылетает с ошибкой какое количество строк после обновлений должно быть равным перед обновлениями. Но я даже не удаляю строки внутри secondVC, я использую их для обновления высоты ячейки с wkwebview внутри.

Так что в этом случае логика того, что должно заканчиваться на втором виртуальном виртуальном канале и прекращать работу после того, как я закрываю его, возникает и влияет на мой первый виртуальный виртуальный канал и вылетает. Я пытался сделать недействительным таймер, когда пользователь возвращается, но он работает, только если начало / конец обновления еще не начались.

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

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

Во-первых, когда wkwebview внутри ячейки didFinish

self.timer = Timer.scheduledTimer(timeInterval: 1.0,
                                          target: self,
                                          selector: #selector(self.updateHeightCell),
                                          userInfo: nil,
                                          repeats: false)

Затем я вызываю webDidLoadWithContentHeight из делегата rootViewController как secondVC.

@objc private func updateHeightCell() {
    self.height = self.webView.scrollView.contentSize.height * 1.2
    self.rootViewController.webDidLoadWithContentHeight(self.height,     currentWebScrollPosition: scrollPositionBeforeLoadFinish)
    self.webView.scrollView.isScrollEnabled = false
    }
    func webDidLoadWithContentHeight(_ height: CGFloat, currentWebScrollPosition: CGFloat) {
        webCellIsLoaded = true
        self.tableView.beginUpdates()
        self.webContentHeight = height
        self.tableView.endUpdates()
        self.webCellReloadedCount += 1
        self.tableView.contentOffset.y = currentWebScrollPosition
        self.setupMaterialBarAlphaIfNecessary()
        self.tableView.isScrollEnabled = true
    }

Кнопка возврата

    override func didMaterialBackButtonTouch() {
        // stop webView
        let cells = tableView.visibleCells
        for cell in cells {
            if (cell.isKind(of: MaterialViewCell3.self)) {
                let webCell = cell as! MaterialViewCell3
                webCell.webView.stopLoading()
                webCell.timer?.invalidate()
            }
        }

        self.viewModel.avoidViewController()
        guard let source = self.source else {
            fatalError("\n[\(self) didMaterialBackButtonTouch] no source view controller!\n")
        }
        switch source {
        case .myFeed:
            self.performSegue(withIdentifier: String.unwindFromMaterialToMyFeedSegueID, sender: self)
        case .mainFeed:
            self.performSegue(withIdentifier: String.unwindFromMaterialToMainFeedSegueID, sender: self)
}
}

Ожидаемый результат состоит в том, что когда пользователь возвращается назад, начало / конец обновлений, которые были вызваны в secondVC, не влияет на mainVC.

...