Да, мы можем. Но вам нужно либо запретить взаимодействие с пользователем во время выполнения асинхронного вызова, либо вам нужно будет прервать асинхронный вызов при взаимодействии с пользователем.
Чтобы предотвратить взаимодействие с пользователем, проще всего добавить другое представление для всего табличного представления, добавить на него какой-либо индикатор активности и сделать его скрытым по умолчанию. Тогда предположим что-то вроде этого:
func userSelectedItem(_ item: MyObject) {
progressBackground?.isHidden = false
progressActivityIndicator?.startAnimating()
MyObject.fetchDetails(id: item.id) { detailedObject in
self.navigationController?.pushViewController(DetailedObjectViewController(detailedObject), animated: true)
self.progressBackground?.isHidden = true
self.progressActivityIndicator?.stopAnimating()
}
}
Это можно назвать похожим на:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
userSelectedItem(items[indexPath.row])
}
но все зависит от того, как вы реализовали свое табличное представление.
В любом случае вам может потребоваться прервать операцию с некоторыми событиями. Например, если пользователь переходит на другой экран во время выполнения асинхронной операции, вы можете запретить вызов после завершения выборки. Самая простая процедура состоит в том, чтобы использовать некоторую переменную, такую как var isVisible: Bool = false
, которая затем устанавливается на true
, когда вид действительно появляется, а значение false
на виде исчезает. Затем вы можете использовать это свойство внутри блока, в который вы помещаете новый контроллер представления и решаете перемещаться или нет.