【问题标题】:How can I run a function before my extension code in Swift?如何在 Swift 中的扩展代码之前运行函数?
【发布时间】:2019-03-22 22:07:08
【问题描述】:

我正在开发一个项目并使用 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
    }
}

【问题讨论】:

    标签: ios swift xcode uitableview swift4


    【解决方案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..&lt;array.count 太可怕了,因为实际上不需要索引。查看我改进的代码。
    • 从不使用默认初始化程序创建表格视图单元格。 重复使用它们。

      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
      

    【讨论】:

    • "永远不要使用默认初始化程序创建表格视图单元格。" ...如果要重复使用该单元格。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2020-10-24
    • 2021-03-31
    • 2012-06-14
    • 2017-10-30
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多