#ios #swift #xcode #uitableview #swift4
#iOS #swift #xcode #uitableview #swift4
Вопрос:
Я работаю над проектом и использую TableView для загрузки данных. Проблема в том, что мне нужно, чтобы количество ячеек определялось конкретной функцией. Мой TableView задает количество ячеек в добавленном мной расширении, поэтому независимо от того, где я вызываю функцию, она все равно выполняется второй. Я был бы очень признателен за любую помощь, вот мой код (функция и расширение):
func setNumCells() {
let uid = Auth.auth().currentUser?.uid
var ref: DatabaseReference!
ref = Database.database().reference()
let applicationReference = ref.child("applications")
ref.child("applications").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
print("So far")
let array = Array(dictionary.keys)
print(array)
for i in 0..<array.count {
ref.child("applications").child(uid!).child(String(array[i])).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let array = Array(dictionary.keys)
self.numApplications = array.count - 1
}
})
}
}
})
}
...
extension ApplicationViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numApplications
}
func tableView(_ tableView: UITableView, cellForRowAt inde xPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.backgroundColor = UIColor.red
tableView.rowHeight = 85
cell.textLabel?.text = "(indexPath.row)"
return cell
}
}
Ответ №1:
Вы должны вызвать reloadData
в табличном представлении и в основном потоке после получения всех данных
Рекомендуемый API для обработки синхронизации DispatchGroup
func setNumCells() {
let uid = Auth.auth().currentUser?.uid
var ref: DatabaseReference!
ref = Database.database().reference()
let applicationReference = ref.child("applications")
let group = DispatchGroup()
ref.child("applications").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
print("So far")
let array = Array(dictionary.keys)
print(array)
for item in array {
group.enter()
ref.child("applications").child(uid!).child(String(item)).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let array = Array(dictionary.keys)
self.numApplications = array.count - 1
}
group.leave()
})
}
group.notify(queue: DispatchQueue.main) {
self.tableView.reloadData()
}
}
})
}
Примечания:
for i in 0..<array.count
ужасно, поскольку индекс фактически не нужен. Посмотрите мой улучшенный код.-
Никогда не создавайте ячейки табличного представления с инициализатором по умолчанию. Повторно используйте их.
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
Комментарии:
1. «Никогда не создавайте ячейки табличного представления с инициализатором по умолчанию». … если ячейка должна использоваться повторно.