如何使用完成处理程序等待 firestore 请求的完成

2024-05-18

我正在慢慢地了解完成处理程序。 如果我有一个 firestore 查询,如果我想使用完成处理程序,则有点向后工作,当 firestore 查询完成时,我必须使用completion() 。

但它的设置功能仍然让我感到困惑。

因此,如果这是一个将闭包作为参数的函数定义:

  func doSomethingAsync(completion: () -> ()) {
  }

我不太明白如何从上面的 func 定义出发并实现它来实现像 firestore 查询和请求这样的真实内容。

 query.getDocuments(){ (querySnapshot, err) in

                if let err = err
                {
                    print("Error getting documents: \(err)")
                }
                else
                {
                    if(querySnapshot?.isEmpty)!
                    {


                        print("there's no document")
                        completion()


                    }
                    else
                    {
                        for document in querySnapshot!.documents
                        {

                            completion()

                        }
                    }
                }

            }

thanks.

update

所以对于我的例子我可以做类似的事情

func getFirestoreData(userID: String, completion @escaping() -> ()){

//firestore code:

query.getDocuments(){ (querySnapshot, err) in

                    if let err = err
                    {
                        print("executed first")
                        completion()
                    }
                    else
                  .......
                    print("executed first")
                    completion()

       }
}

调用我正在执行的函数:

getFirestoreData(userID: theUserID) {

            print("executes second")

        }

print("executes third") after function execution.

我希望发生的是编程在继续执行之前等待completion()。

但是“执行第三个”首先发生,然后“执行第一个”,然后“执行第二个”。

Thanks


这是完整的示例(带 API 调用) 请注意:状态变量只是找出服务器响应内容的关键 (0:来自服务器的错误,1:成功,-1:我的代码中有问题)

 func logout(handlerBack: @escaping (_ error: Error?, _ status:Int?, _ error_message:String?)->())
{

    Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil)
        .responseJSON { respons in
            switch respons.result {
            case .failure(let theError):
                handlerBack(theError, 0, nil)

            case .success(let data):
                let json_data = JSON(data)

                /// if couldn't fetch data
                guard let status = json_data["status"].int else {
                    handlerBack(nil,-1, "can't find status")
                    return
                }

                /// if statuse == 0
                    guard status == 1 else {
                        handlerBack (nil, 0 , json_data["errorDetails"].string)
                        return
                    }

                // that's means everything fine :)
                    handlerBack(nil, 1 , nil)
                }
        }
    }

这是实现它的方法:

        // call func 
  self.logout { (error:error, status:Int, error_message:String) in
            // if status not 1, figure out the error 
        guard status == 1 else {
            // try to find error from server
            guard let error_message = error_message else {
            // else error something else 
                print ("Error at :: \(#function)")
                // don't do anything ..just return 
                return
            }
            self.showMessageToUser(title: error_message, message: "", ch: {})
            return
        }
                   // this part do what ever you want, means every thing allright 
    }

更新 : 您正在寻找等待单元执行“第一”和“第二”的东西

在这种情况下使用DispatchGroup()这是例子:

            var _dispatch_group = DispatchGroup()

        getFirestoreData(userID: theUserID) {

            _dispatch_group.enter()
            print("executes second")


            _dispatch_group.leave()

        }

        _dispatch_group.notify(queue: .main) {
        print("executes third")
        }

输出是:

executes First
executes Second
executes Third
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用完成处理程序等待 firestore 请求的完成 的相关文章

随机推荐

  • 服务器上的 Rails 会话

    我想让一些 Rails 应用程序在不同的服务器上共享同一个会话 我可以在同一服务器内完成此操作 但不知道是否可以在不同服务器上共享 有人已经做过或者知道怎么做吗 Thanks Use the 数据库会话存储 https github com
  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • 从 df 中提取具有两列的重叠行对

    我想找出这两个表之间哪些对重叠 gt dput data1 structure list Name x c MDH1 MDH1 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 SCOALB SCOALB CSY4 CS
  • 使用无符号整数时循环条件停止于 0?

    我有一个必须从 N 到 0 含 的循环 我的i变量的类型size t通常是无符号的 我目前正在使用以下代码 for size t i N i size t 1 i 那是对的吗 有没有更好的方法来处理这种情况 Thanks Vincent 是
  • Play:获取默认数据库的连接

    我想获得与我在写入时定义的数据库实例的连接应用程序配置文件 db default driver com mysql jdbc Driver url jdbc mysql localhost test username password Th
  • 如何在 Django QuerySet 中将 DateField() + TimeField() 转换为本地时间?

    我的模型为这些字段 date models DateField 开始时间 models TimeField 结束时间 models TimeField 我想用以下方式注释查询集start datetime and end datetime
  • ExpandableListView / 滑动菜单中的向下钻取

    这里是当前用户界面对于侧面菜单 这是一个应用程序的图像DRILL DOWN or Expandable ListView Menu 如何为第一张图片创建相同的菜单 UI 看起来您已经发布了另一个类似的问题 其中我提供了几个指向教程的链接以及
  • 将html表格保存到excel中[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须编写一个程序 定期读取网页并将
  • 需要 SQL 查询澄清[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个由以下列组成的表 billid patientid doctorid fees 如何显示治疗多名患者的医生 尝试了以下代码并得到了
  • Jquery 移动应用程序的奇怪行为

    我创建了一个应用程序 其中包含多个主页按钮 单击其中一个按钮 我的应用程序将重定向到某个视图 其中包含 JQM 表单 JQM 日历 文本字段 按钮和数据库等 我的问题是 当我在 Android 设备上测试我的应用程序时 即使我没有使用任何图
  • 在 digraph_utils:is_acirclic/1 返回 false 后查找循环或循环

    我怎样才能 有效地 在Erlang有向图中找到循环或循环digraph utils is acyclic 1返回假 EDIT is acyclic is 定义为 https github com erlang otp blob maint
  • 正则表达式:无法找出与单个事件匹配的表达式,并且仅匹配包含特定单词的行

    我正在尝试使用 Sublime Text 作为编辑器清理并合并一些旧的日历文件 x ics 打开文件会得到一个长文件 如下所示 我想删除 即替换为任何内容 文件中在摘要中提及生日的所有条目 VEVENT 并保留所有其他条目 因此我使用正则表
  • C++ 整数溢出和提升[重复]

    这个问题在这里已经有答案了 可能的重复 当二元运算符两侧的符号不同时 提升规则如何工作 https stackoverflow com questions 6770258 how do promotion rules work when t
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • 我可以从命令行或 MS-Dos 启用/禁用网络连接吗?

    我想从 Windows 8 中的命令行启用 禁用网络连接 netsh interface set interface Local Area Connection DISABLED 要启用该接口 您需要运行 netsh interface s
  • 何时在 mysql 中使用 Union [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于 Union 您会在什么现实情况下使用它 因为对我来说 对具有不同列用途 含义的两个表中的两个选择查询使用联合是没有意义的 例如
  • 使用节、页眉和页脚标签代替数据角色

    Jon Reid 在他的 jQuery Mobile 书中提出了使用 html5 标签的好主意 section section
  • 绑定到 ajax 调用的 Spinner 将不会显示,除非我在 javascript 中添加警报

    我编写了一个简单的方法 将微调器添加到 html 页面的主体 并将事件绑定到 ajaxstart 方法 然后在 ajaxstop 上将其删除 StartAjaxCallSpinner function spinnerObj var bod
  • 为什么我不能在 super() 调用周围使用 try 块?

    因此 在 Java 中 构造函数的第一行必须是对 super 的调用 无论是隐式调用 super 还是显式调用另一个构造函数 我想知道的是 为什么我不能在它周围放置一个 try 块 我的具体情况是我有一个模拟课程用于测试 没有默认的构造函数
  • 如何使用完成处理程序等待 firestore 请求的完成

    我正在慢慢地了解完成处理程序 如果我有一个 firestore 查询 如果我想使用完成处理程序 则有点向后工作 当 firestore 查询完成时 我必须使用completion 但它的设置功能仍然让我感到困惑 因此 如果这是一个将闭包作为