Как установить переменную внутри замыкания с помощью Swift 5 и использовать ее вне замыкания - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь установить переменную внутри замыкания, используя Swift.Я хочу затем получить значение за пределами замыкания для дальнейшей обработки.Я не могу этого сделать.Есть ли способ, которым я могу это сделать?Я попробовал код ниже.Я прокомментировал ту часть, где я действительно хочу, чтобы действия были выполнены.

class AttendanceDetailTVC: UITableViewController {

    var TPNumber = ""
    var Module = ""
    var AID = ""
    var intake = ""

    @IBOutlet var tblDetail: UITableView!

    var detailList = [DetailModel]()


    var ref = Database.database().reference()

    override func viewDidLoad() {
        super.viewDidLoad()
        tblDetail.delegate = self
        tblDetail.dataSource = self

        ref.child("Student").child(TPNumber).child("Intake").observeSingleEvent(of: .value, with: {(snapshot) in
            self.intake = (snapshot.value as? String)!
            self.detailList.removeAll()
        })
        ref.child("Record").observe(.value) { (snapshot) in
            for child in snapshot.children.allObjects as! [DataSnapshot] {
                let value = child.key

                self.ref.child("Attendance").child(value).child("Intake").observe(.value, with: { (snapshot) in
                    for child1 in snapshot.children.allObjects as! [DataSnapshot] {
                        let value1 = child1.key

                        self.ref.child("Attendance").child(value).child("Intake").child(value1).observe(.value, with: { (snapshot) in
                            if let value2 = snapshot.value as? String {
                                if (self.intake == value2) {
                                    self.AID = value //This is where I set the value
                                }
                            }
                        })
                    }
                })
            }
            let det = DetailModel(AID: self.AID as String?) //This is where I want to use the value
            self.detailList.append(det)

            self.tblDetail.reloadData()
        }
    }

Любая помощь будет оценена!Заранее спасибо!

1 Ответ

3 голосов
/ 19 сентября 2019

Вы выполняете эту функцию одновременно, не дожидаясь фактического извлечения данных в первую очередь:

override func viewDidLoad() {
    super.viewDidLoad()
    tblDetail.delegate = self
    tblDetail.dataSource = self
    ref.child("Record").observe(.value) { (snapshot) in
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let value = child.key

            self.ref.child("Attendance").child(value).child("Intake").observe(.value, with: { (snapshot) in
                for child1 in snapshot.children.allObjects as! [DataSnapshot] {
                    let value1 = child1.key

                    self.ref.child("Attendance").child(value).child("Intake").child(value1).observe(.value, with: { (snapshot) in
                        if let value2 = snapshot.value as? String {
                            if (self.intake == value2) {
                                self.AID = value //This is where I set the value
                                self.reloadTable()
                            }
                        }
                    })
                }
            })
        }
    }
}
func reloadTable() {
    let det = DetailModel(AID: self.AID) //This is where I wanna retrieve the value
    self.detailList.append(det)
    self.tblDetail.reloadData()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...