Почему печать вне блока наблюдения выполняется до печати (подсчета) внутри блока наблюдения? - PullRequest
0 голосов
/ 16 ноября 2018
func teacherExists(teacherName: String) -> Bool
    {
        var dataBaseRef2: DatabaseReference!
        dataBaseRef2 = Database.database().reference()
        let teachersTableRef = dataBaseRef2.child("teachers")
        self.teachersList.removeAll()
        teachersTableRef.observeSingleEvent(of: DataEventType.value, with: { (snapshot) in

       // teachersTableRef.observe(.value)
        //{
          //  snapshot in
            let teachersNamesDictionary = snapshot.value as? [String: Any] ?? [:]
            for(key, _) in teachersNamesDictionary
            {
                if let teacherDict = teachersNamesDictionary[key] as? [String: Any]
                {
                    if let teacher = Teacher(dictionary: teacherDict)
                    {
                        //print(teacher.teacher_name)
                        self.teachersList.append(teacher.teacher_name)
                    }
                }
            }
            print(self.teachersList.count)
        })
        print("Outside \(self.teachersList)")
        return false
    }

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вы можете использовать замыкание для обратного вызова после проверки на наличие дубликатов

func teacherExists(teacherName: String, completion: @escaping ((Bool) -> Void)) -> Void {
    var dataBaseRef2: DatabaseReference!
    dataBaseRef2 = Database.database().reference()
    let teachersTableRef = dataBaseRef2.child("teachers")
    self.teachersList.removeAll()
    teachersTableRef.observeSingleEvent(of: DataEventType.value, with: { (snapshot) in

        let teachersNamesDictionary = snapshot.value as? [String: Any] ?? [:]
        for(key, _) in teachersNamesDictionary
        {
            if let teacherDict = teachersNamesDictionary[key] as? [String: Any]
            {
                if let teacher = Teacher(dictionary: teacherDict)
                {
                    //print(teacher.teacher_name)
                    self.teachersList.append(teacher.teacher_name)
                }
            }
        }
        let exists = self.teachersList.contains(teacherName)
        completion(exists)
    })
}

И вызывать функцию, как показано ниже

teacherExists(teacherName: newTeacherName) { (exists) in
    if exists {
        // show alert
    } else {
        // add new teacher to db
    }
}

Надеюсь, это поможет!

0 голосов
/ 16 ноября 2018

ошибка при вызове функции teacherExists

let OKAction = UIAlertAction(title: "OK", style: .default, handler:
    {
        (action: UIAlertAction!) ->Void in
        let textfield = alert.textFields![0] as UITextField
        newTeacherName = textfield.text!.uppercased()
        if !(newTeacherName.isEmpty)
        {
            //checking if teacher already exists using function teacherExists
            let exists = self.teacherExists(teacherName: newTeacherName, completion:

            if exists == true //if duplicate teacher is found
            {
                let alert = UIAlertController(title: "Duplicate Teacher", message: "Teacher \(newTeacherName) has been added earlier", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                self.present(alert, animated: true, completion: nil)
            }
            else
            {
                //add teacher to database here
                let dict = ["teacher_name" : newTeacherName]
                let newTeacher = Teacher(dictionary: dict)
                let tableRef = self.dataBaseRef.child("teachers") //getting reference of node with name teachers
                let recordRef = tableRef.childByAutoId() //creating a new record in teachers node
                recordRef.setValue(newTeacher!.toDictionary())//adding data to new record in teachers node
            }
        }
    })
0 голосов
/ 16 ноября 2018

Поскольку API-интерфейсы Firebase все асинхронные .Было бы плохо для вашего приложения, если бы они заблокировали ваш путь к коду, потому что это может привести к зависанию вашего приложения на неопределенный срок.

observeSingleEvent возвращает немедленно , и переданный наблюдатель вызывается некоторое времяпозже, когда данные, наконец, готовы.Выполнение продолжается на следующей строке, которая выводится на консоль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...