Когда вы звоните и -viewDidLoad
, и -viewWillAppear
(которые перезагружают ваше табличное представление и выполняют ваш запрос API для извлечения ваших данных и заполнения вашей модели соответственно), одна из причин, по которой вы, возможно, не видите свою базовую модель данных, заключается в обновление заключается в том, что вы звоните обоим до того, как попытаетесь отправить запрос на удаление на конечную точку API. Если вы переместите свой вызов на -viewWillAppear
в блок завершения вашего запроса на удаление, то это обеспечит выполнение вашего запроса на получение обновленных данных из вашего API после завершения удаления.
Это самое малое, что вы можете сделать, чтобы получить такую работу, как вы ожидаете, однако я настоятельно рекомендую уделить немного времени, чтобы выделить вашу бизнес и сетевую логику. Вы не должны сами звонить -viewDidLoad
или -viewWillAppear
. Это методы жизненного цикла UIViewController, которые вызываются UIKit для вас в течение жизненного цикла вашего контроллера представления. Вместо этого я бы рекомендовал (по крайней мере) выделять некоторые методы или методы в другие классы, которые обрабатывают такие вещи, как выборка вашей модели данных с сервера или удаление определенных записей. Затем вы можете вызывать эти методы из своего делегата табличного представления или UIAlertAction
более многократно используемым и изолированным способом, не беспокоясь о каких-либо непреднамеренных побочных эффектах вызова ваших методов жизненного цикла UIViewController просто для повторной выборки некоторых данных.
Итак, хотя я действительно не рекомендую, чтобы вы в конечном итоге указали это в качестве окончательного кода, а не:
//THIS IS WHERE I TRY TO RELOAD THE PAGE
//
print("reloading...")
self.viewDidLoad()
self.viewWillAppear(true)
URLSession.shared.dataTask(with: request) { (data, response, error) in
Вы можете сделать это:
URLSession.shared.dataTask(with: request) { (data, response, error) in
//THIS IS WHERE I TRY TO RELOAD THE PAGE
//
print("reloading...")
self.viewDidLoad()
self.viewWillAppear(true)
Опять же, я настоятельно рекомендую, по крайней мере, извлечь вашу выборку и удалить логику API.
У вас также есть несколько вариантов выполнения действия удаления и отображения пользователю, что запись была удалена.
Как описано выше, минимальные изменения, необходимые для того, что вы имеете, просто гарантируют, что ваша обновленная модель данных будет выбрана только после успешного выполнения запроса на удаление.
В качестве альтернативы вы можете с оптимизмом создать впечатление, что ваш запрос на удаление успешно выполнен, обновив локальную модель данных поддержки и либо удалив поврежденную строку, либо перезагрузив таблицу.
Поскольку прежний подход связан с проблемами подключения и задержки в сети, он может показаться пользователю слишком запоздалым, когда он пытается удалить запись, и вы теряете возможность использовать преимущества анимаций UITableView, которые дают понять, что строка была Исключен.
Последний подход будет более отзывчивым для пользователя. Для этого подхода вам нужно будет удалить удаленный объект из вашего массива, где вы в данный момент вызываете -viewDidLoad
и -viewWillAppear:
, а затем удалить соответствующую строку . Что-то вроде:
self.vehicles.removeAt(indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
У вас есть выбор типов анимации .
Одна из проблем оптимистичного удаления записи и строки локально в вашем приложении состоит в том, что если запрос API по какой-то причине не выполняется, то при следующем извлечении вашей модели данных ваш пользовательский интерфейс может показаться непоследовательным - это будет выглядеть так, как будто запись не был удален (что на самом деле так). Таким образом, в зависимости от важности согласованности и объема обработки ошибок, который вам необходимо выполнить, вам нужно будет согласовать любые ошибки, возникающие как часть вашего запроса на удаление. Здесь снова у вас есть много вариантов. Вы можете попробовать удалить снова за кулисами, вы можете предупредить пользователя, а затем добавить строку назад, чтобы он мог повторить попытку или просто ничего не делать.