Итак ... Привет ... Я тянул за волосы на этом, надеюсь, что кто-нибудь может мне помочь.
лучше, если я покажу вам код, чтобы вы знали, что я делаю, и это изображение, чтобы упростить понимание. Изображение здесь
в основном я пишу на этих 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. и я пришел к выводу, что это мой обработчик завершения неверен. (Думаю).
Спасибо!