热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Firebase查询在错误的时间运行-FirebaseQueryRunningAtWrongTime

ForsomereasonwhenIrunthefollowingmethod,thefirstqueryrunsafterthemethodcompletes.I

For some reason when I run the following method, the first query runs after the method completes. I tried using a dispatch block in order to force the query to run first, but the query never runs at all then and the app simply freezes. Let me know if you know what is wrong.

出于某种原因,当我运行以下方法时,第一个查询在方法完成后运行。我尝试使用调度块以强制查询首先运行,但查询永远不会运行然后应用程序只是冻结。如果你知道什么是错的,请告诉我。

Method without dispatch group:

没有派遣组的方法:

func loadConversations() {
    let ref = FIRDatabase.database().reference()
    let cOnvoRef= ref.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("conversations")
    var cOnversationID= [String]()
    print(1)
    convoRef.queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in
        let enumerator = snapshot.children
        print(2)
        while let rest = enumerator.nextObject() as? FIRDataSnapshot {
           print(3)
            if let id = rest.value as? String{
                conversationID.append(id)
                print(id)
            }
        }
    })
    print(4)
    print("size: \(conversationID.count)")
    for id in conversationID {
     print(5)
       ref.child("conversations").queryEqual(toValue: id).observeSingleEvent(of: .value, with: { (snapshot) in
      print(6)
            if let cOnvo= snapshot.value as? [String : AnyObject] {
          print(7)
                let cOnversation= Conversation()
                conversation.cOnversationID= id
                conversation.name = "Temporary test name"
                self.Conversations.append(conversation)
            }
       })
        ref.removeAllObservers()
    }
    print(8)
    self.conversationTableView.reloadData()
    ref.removeAllObservers()

}

This prints:

这打印:

1
4
size: 0
8
2
3
-KZyMMzXmkQC_OF0T08_

With the dispatch group:

使用调度组:

func loadConversations() {
    let dispatchGroup = DispatchGroup() 
    let ref = FIRDatabase.database().reference()
    let cOnvoRef= ref.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("conversations")
    var cOnversationID= [String]()
    print(1)


    dispatchGroup.enter()
    convoRef.queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in

        let enumerator = snapshot.children
        print(2)
        while let rest = enumerator.nextObject() as? FIRDataSnapshot {
           print(3)
            if let id = rest.value as? String{
                conversationID.append(id)
                print(id)
                dispatchGroup.leave()
            }
        }


    })

    print(4)
    dispatchGroup.wait()
    print("size: \(conversationID.count)")

    for id in conversationID {
     print(5)
       ref.child("conversations").queryEqual(toValue: id).observeSingleEvent(of: .value, with: { (snapshot) in
      print(6)
            if let cOnvo= snapshot.value as? [String : AnyObject] {
          print(7)
                let cOnversation= Conversation()
                conversation.cOnversationID= id
                conversation.name = "Temporary test name"
                self.Conversations.append(conversation)
            }
       })
    }
    print(8)
    self.conversationTableView.reloadData()
    ref.removeAllObservers()
}

This prints

这打印

1
4

but then it just freezes and waits. The query never runs.

但它只是冻结和等待。查询永远不会运行。

I am not sure why the query just does not appear to be entered. When the query is entered, it works perfectly fine, but it is entered too late. Any help is greatly appreciated. Thanks!

我不确定为什么查询似乎没有输入。输入查询后,它完全正常,但输入太晚了。任何帮助是极大的赞赏。谢谢!

1 个解决方案

#1


2  

This is simply because Firebase queries are executed on a background thread as it is essentially a network call. Hence the response comes after your method completes, otherwise the UI will be blocked until a response comes from Firebase

这只是因为Firebase查询是在后台线程上执行的,因为它本质上是一个网络调用。因此,响应在您的方法完成后发出,否则UI将被阻止,直到响应来自Firebase

You need to write a closure inside your query response to execute a block of code as soon as you get the response.

您需要在查询响应中编写一个闭包,以便在获得响应后立即执行代码块。

func loadConversations(completion:@escaping (Array) -> Void) -> Void {
    let ref = FIRDatabase.database().reference()
    let cOnvoRef= ref.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("conversations")
    var cOnversationID= [String]()
    print(1)
    convoRef.queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in
        let enumerator = snapshot.children
        print(2)
        while let rest = enumerator.nextObject() as? FIRDataSnapshot {
           print(3)
            if let id = rest.value as? String{
                conversationID.append(id)
                print(id)
            }
        }
        completion(conversationID)
    })
}

This will send your call back to wherever it was called from and inside

这会将您的呼叫发送回来自内部和外部的任何地方

loadConversations { (array) in

    //do something with this value and execute next query
}

推荐阅读
  • IhaveaFirebasedatabasethatismodeledassuch:我有一个这样建模的Firebase数据库::users:some-random ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • MybatisPlus入门系列(13) MybatisPlus之自定义ID生成器
    数据库ID生成策略在数据库表设计时,主键ID是必不可少的字段,如何优雅的设计数据库ID,适应当前业务场景,需要根据需求选取 ... [详细]
  • NB:我看到我的草稿中已有将近两年的教程,所以我决定将其发布。在本教程中,我将构建一个简单的reactJs应用程序,该应用程 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了当应用程序处于后台状态时,FCM多次推送通知无法正常工作相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
陌北从南_221
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有