如何在 Fire Base 中使用完成处理程序

Posted

技术标签:

【中文标题】如何在 Fire Base 中使用完成处理程序【英文标题】:How do I use completion handlers in Fire Base 【发布时间】:2018-03-25 19:41:16 【问题描述】:

我无法理解如何正确使用完成处理程序,尤其是与 firebase 代码相关的情况。据我了解,完成处理程序在 Fire Base 异步完成时执行,对。因此,为了了解它的工作原理,我只想在使用 FB 收集数据时使用完成处理程序打印“DONE”。

我试过下面的代码,但是我显然不明白,因为它不起作用。

//PUTTING THE FB CODE IN FUNCTION
func test(completion: @escaping (String) -> Void) 

   databaseRef.child(dataRecieverStringRecipeView!).observeSingleEvent(of: .value, with: (snapshot) in
        for item in snapshot.children.allObjects as! [DataSnapshot] 
            let thisItem = item.value as! NSDictionary

            let tempRecipe = Recipe()
            tempRecipe.fbKey = item.key
            tempRecipe.recipeHeaderObject = (thisItem["recipeHeaderFirebase"] as! String)
            tempRecipe.recipeTextObject = (thisItem["recipeIngredientsTextFirebase"] as! String)
            tempRecipe.recipeImageObject = (thisItem["recipeImageFirebase"] as! String)

            self.recipeClassArray.append(tempRecipe) //ADD OBJECT TO ARRAY
        

    ) //END LOOP
       completion("DONE")

 //COMPLETION
test()//???Not sure what to do here...

【问题讨论】:

【参考方案1】:

完成处理程序基本上是 WHEN 语句。

当一个事件发生时(例如接收到一个api调用的结果),触发completion()。你也可以通过这个completion来传递值。

func test(completion: @escaping (_ message: String) -> Void) 

   databaseRef.child(dataRecieverStringRecipeView!).observeSingleEvent(of: .value, with: (snapshot) in
        //you are inside a completion handler. this code executes WHEN you've received a snapshot object

        // so you loop through and process the items
        for item in snapshot.children.allObjects as! [DataSnapshot] 
            let thisItem = item.value as! NSDictionary

            let tempRecipe = Recipe()
            tempRecipe.fbKey = item.key
            tempRecipe.recipeHeaderObject = (thisItem["recipeHeaderFirebase"] as! String)
            tempRecipe.recipeTextObject = (thisItem["recipeIngredientsTextFirebase"] as! String)
            tempRecipe.recipeImageObject = (thisItem["recipeImageFirebase"] as! String)

            self.recipeClassArray.append(tempRecipe) //ADD OBJECT TO ARRAY
        

        // and its done here
        completion("DONE")

    )

 

 // Now to use it...
 // You need to pass in a completion handler varaible to your test function when calling it
 test(completion:  message in
     // WHEN you get a callback from the completion handler,
        print(message)

 )

【讨论】:

它就像一个魅力!非常感谢您为我澄清这一点。我现在对完成处理程序和使用它们有了基本的了解!惊人的! :)【参考方案2】:

您需要将闭包传递给您的 test() 方法,如下所示:

test(completion: (status: String) -> Void print(status) )

或者像这样:

func completion(status: String) print(status) test(completion: completion)

你也可以使用尾随闭包语法,因为你的闭包是最后一个参数:

test() (status) in print(status)

【讨论】:

谢谢!这也很棒! 如果你这么认为,也许你可以支持我的回答:)

以上是关于如何在 Fire Base 中使用完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章

如何从 fire-base 为不同的产品风格 Android 生成不同的 json 文件

如何在非亚马逊 AppStore Kindle Fire 应用程序中嵌入高分辨率图标?

我可以在使用 AWS amplify for Cognito 和 DataStore 的同时使用 fire base 来托管我的 Flutter Web 应用程序吗

如果超时或无法访问服务器,Fire base 不会调用 onCancelled

如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`

如何在 android studio IDE 中开始为 fire os 开发应用程序