完成处理程序:::如何在上传到firebase完成后才运行一段代码?

问题描述 投票:0回答:1

所以......嗨......我一直在拉我的头发,希望有人能帮助我。

最好的办法是我把代码给你看,这样你就知道我在做什么,还有这个图片,让你更容易理解。图片在这里

基本上,我是在这些UITextFields上写文章,检查它们是否有文本,就像这样。

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

然后把布尔值传给my rightBarButtonItems 标题为 "完成"(如上图所示)。

现在,只要我按下 "完成 "按钮,我就会保存 "完成 "的信息。UUID()uuidString 正如你在这里看到的。(1 of 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 of 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上的 "Ok "时就会被触发。

var item: Item!
private func saveHomeToFireBase() {

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

    saveHomeToFirestore(home)


}

这里的最终目的是在Firebase中创建第二个文件夹(或一个新的集合),里面有项目的内容。UUID().uuidString 作为它的属性......因此我需要一个完成的汉德:运行一个新的汉德。saveHomeToFirestore(home) 只有在上传的项目和其对应的 UUID() 我的结论是,我的完成处理程序不正确。我想)。

谢谢你!所以...

swift firebase closures
1个回答
1
投票

你没有在'saveItemToFirebase'中调用完成块,也没有将firebase调用设置为完成,所以代码会在调用API后停止。

我建议你把 "pushItemToFirestore "设置成和 "saveItemToFirebase "完全一样,除了 "item "参数,然后像这样调用 "pushItemToFirestore"。

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

你基本上要做两个完成语句。

© www.soinside.com 2019 - 2024. All rights reserved.