Swift Firebase 查询最多需要一分钟

Posted

技术标签:

【中文标题】Swift Firebase 查询最多需要一分钟【英文标题】:Swift Firebase query taking up to a minute 【发布时间】:2017-03-30 16:08:57 【问题描述】:

好的,我有一个 Swift 应用程序,它在这个 Firebase 数据库中加载到一个表格视图中。问题在于,获取 Firebase 响应并加载数据可能需要整整一分钟。无论互联网连接如何,都会发生这种情况。我在这里做错了什么吗,数据库中只有 7 个这样的项目,所以我看不出这是数据库太大的问题。我还应该注意到,通过浏览器上的 Firebase 控制台加载实时数据库至少需要一分钟。

知道这里出了什么问题吗?下面是我查询数据库的代码,以及我在 Firebase 控制台中加载的内容的快照。

哦,我使用的是免费的 Firebase 帐户,但我在定价选项中没有看到任何速度限制,所以我认为这不是问题。

  private func loadItems()

    var ref: FIRDatabaseReference!
    ref = FIRDatabase.database().reference()

    ref.child("DonationItem").observeSingleEvent(of: .value, with:  (snapshot) in

        if let values = snapshot.value as? NSDictionary 

            for (key,_) in values

                let donationItem: NSObject = values[key] as! NSObject

                let myTitle: String! = donationItem.value(forKey: "title") as? String
                let myItemID: String! = donationItem.value(forKey: "itemID") as? String

                let myPhotoString = donationItem.value(forKey: "image") as? String
                let decodedData = NSData(base64Encoded: myPhotoString!)
                let myImage = UIImage(data: decodedData as! Data)

                let myDescription = donationItem.value(forKey: "description") as? String
                let myDate = donationItem.value(forKey: "expiration") as? String
                let myLatitude = donationItem.value(forKey: "latitude") as? Double
                let myLongitude = donationItem.value(forKey: "longitude") as? Double
                let myCoordinates = CLLocationCoordinate2D(latitude: myLatitude!, longitude: myLongitude!)
                let myUserID = donationItem.value(forKey: "userID") as? String
                let myAddress = donationItem.value(forKey: "address") as? String


                var  donated: Bool
                if let donatedInt = donationItem.value(forKey: "donated") as? Int 
                    donated = Bool(donatedInt as NSNumber)
                 else 
                    donated = true
                

                let donation1 = DonatedItem(myTitle, myImage!, donated, myDescription!, myDate!, myCoordinates, myUserID!, myItemID!, myAddress!)
                self.addItem(item: donation1!)

                
        


    )  (error) in
        print(error.localizedDescription)
    


这是 Firebase 控制台。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

long 和 lat 是如何确定的,是在查询执行之前完成的吗?问题可能不是查询。

编辑:

编码的图像大小最终是这个问题的问题。如果图像是硬编码的图像 url,图像可能会变得非常大并减慢查询中的响应时间。注意检索图像的方式。

正如@riper 在对此答案的评论中所写,更好的方法是将图像存储在 Firebase 存储中并将其引用放在数据库中。

【讨论】:

实际上我现在只是对这两个值进行硬编码,因为应用程序的那部分还没有开发——所以我不相信在查询之前已经完成了任何繁重的计算。跨度> 您是否尝试过在不解码图像的情况下运行查询?在项目中放置一个占位符图像并加载它作为现在的测试。我看不出任何明显的迹象表明它可能会变慢,尤其是对于硬编码值。 是的 似乎没有什么不同。虽然使用秒表,但它现在在大约 16 秒内加载(有和没有解码)。我计时了在 Web 控制台中加载所需的时间,大约需要 20 秒。需要这么长时间是正常的吗? 所以我找到了问题所在。编码的图像字符串非常大,导致 json 文件大小为 20mb。你的回答让我走上了正确的道路,所以我会奖励你作为感谢的答案 您可能希望将这些图像存储在 Firebase 存储中,然后在实时数据库中添加对它的引用。 AFAIK 建议在实时数​​据库中存储多达 10MB。最重要的是,如果你有很多,将它存储在 Storage 中会便宜得多。

以上是关于Swift Firebase 查询最多需要一分钟的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 删除 Firebase 上超过 30 分钟的数据? [复制]

查询和 Firebase 中的位置(swift 3)

firebase swift -- 用户查询

Swift 中带有过滤器的高级 Firebase 查询

Firebase 查询(在 Swift 中)在应用的所有用户中查找特定值

时间戳方程 - Firebase 数据库 + Swift