Обработчик завершения ::: как запустить блок кода только после того, как загрузка была завершена в firebase? - PullRequest
1 голос
/ 18 июня 2020

Итак ... Привет ... Я тянул за волосы на этом, надеюсь, что кто-нибудь может мне помочь.

лучше, если я покажу вам код, чтобы вы знали, что я делаю, и это изображение, чтобы упростить понимание. Изображение здесь

в основном я пишу на этих UITextFields и проверяю, есть ли в них текст, например:

func fieldsAreCompleted() -> Bool {
    return (titleTextField.text != "" && priceTextField.text != "" && wasPricedTextField.text != "")
}

и передаю логическое значение в my rightBarButtonItems под названием «Готово» (как вы можете видеть на изображении выше).

Теперь, как только я нажимаю кнопку Done BarButton, я сохраняю UUID()uuidString, как вы можете видеть здесь: (1 из 2)

private func saveItemToFirebase(completion: (() -> Void) -> Void) {

    let item = ItemModel()

    item.id = UUID().uuidString
    item.name = titleTextField.text!
    item.description = descriptionInput.text
    item.price = Double(price.text!)
    item.wasPrice = Double(wasPriced.text!)

    // This function is the one that actually does the work of saving "item" to firebase
    pushItemToFirestore(item)
}

и вот как мое действие Done BarButton: (2 из 2)

@objc func done() {

    if fieldsAreCompleted() && switchObj.isOn {

        saveItemToFirebase { (_) in

            let alertController = UIAlertController(title: "Some title here", message: "Some message here", preferredStyle: .alert)
            let okAction = UIAlertAction(title: "Ok", style: .default) { [weak self] (_) in

                guard let strongSelf = self else { return }

                //trigger this function when pressing ok
                strongSelf.saveHomeToFireBase()

                strongSelf.navigationController?.popViewController(animated: true)

            }

            let cancelAction = UIAlertAction(title: "No", style: .cancel) { (_) in
                self.navigationController?.popViewController(animated: true)
            }

            alertController.addAction(cancelAction)
            alertController.addAction(okAction)
            self.present(alertController, animated: true, completion: nil)
        }
    } else {

        print("Error all fields are required")

    }
}

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

Наконец, внутри закрытия у меня есть функция, которая запускается, когда я нажимаю " Хорошо "в UIAlert:

var item: Item!
private func saveHomeToFireBase() {

    let home = HomeModel()
    home.itemId = item.id

    saveHomeToFirestore(home)


}

Конечная цель здесь - создать вторую папку (или новую коллекцию) в Firebase со свойством элемента UUID().uuidString ... следовательно, мне нужен Обработчик завершения: запускать saveHomeToFirestore(home) только после того, как загруженный элемент с соответствующим ему UUID() был сохранен в firebase. и я пришел к выводу, что это мой обработчик завершения неверен. (Думаю).

Спасибо!

1 Ответ

1 голос
/ 18 июня 2020

Вы не вызываете блок завершения в 'saveItemToFirebase', и у вас нет настройки вызова firebase для завершения, поэтому код остановится после вызова API.

Я предлагаю вам настроить pushItemToFirestore точно так же, как вы сделали для saveItemToFirebase, за исключением параметра «item», а затем вызвать pushItemToFirestore вот так:

pushItemToFirebase { (_) in
  // completion statement here
}

в основном делать два заявления о завершении.

...