Мой проект имеет 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.