Как я могу запустить функцию перед моим кодом расширения в Swift?

#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. «Никогда не создавайте ячейки табличного представления с инициализатором по умолчанию». … если ячейка должна использоваться повторно.