Существует несколько проблем с вашим кодом.
1) Вы вызываете get data до того, как ваше табличное представление зарегистрировало ячейки. Поэтому, если ваш API будет загружать данные немедленно, табличное представление будет вызывать методы dataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
, но поскольку
self.tableViewTaskType.register(UITableViewCell.self, forCellReuseIdentifier: "cell1")
self.tableViewFrame.register(UITableViewCell.self, forCellReuseIdentifier: "cell2")
self.tableViewAssignTo.register(UITableViewCell.self, forCellReuseIdentifier: "cell3")
вызывается в конце viewDidLoad, вы получите сбой при удалении из очередиваши ячейки в методе cellForAtIndexPath.
Решение состоит в том, чтобы переместить вызов getData в конец метода viewDidLoad.
2) Если вы хотите отобразить данные всех таблиц за один раз (когда API будет завершен)загружая getFramesData, getTaskTypeData и GETUserData) вам нужно будет синхронизировать эти обратные вызовы. Вы можете сделать это с DispatchGroup.
func getData () {
let apiDispatchGroup = DispatchGroup()
APICallBack.getFramesData { success in
apiDispatchGroup.leave()
}
apiDispatchGroup.enter()
APICallBack.getTaskTypeData { success in
apiDispatchGroup.leave()
}
apiDispatchGroup.enter()
APICallBack.GETUserData { success in
apiDispatchGroup.leave()
}
apiDispatchGroup.enter()
apiDispatchGroup.notify(queue: DispatchQueue.main) {
self.tableViewTaskType.reloadData()
self.tableViewAssignTo.reloadData()
self.tableViewFrame.reloadData()
}
}
3) Не очень хорошая идея использовать один класс dataSOurce для множественного UITableView, потому что dataSource становится объектом бога. Лучше всего использовать один ContainerViewController, который содержит три дочерних UITableViewController, и передавать данные дочерним элементам, когда данные загружаются из API.