ios - Firebase 观察大型数据库缓慢

标签 ios swift firebase firebase-realtime-database

我正在开发一款根据用户位置显示地点(从 firebase 下载)的应用。

我目前有 5k 个条目,它们会在大约 10 秒内显示。 我计划有 80k 个条目,我不希望用户等待那么久。

我做了什么: 我创建了一个 Place 类,我在我的 firebase ref 上执行 'observe'(.value) 并且在每个子项上我将每个元素放在 Place 类的一个属性中。 然后将place:Place = Place(attributes) id添加到一个array:Place中,直到所有地方都下载完。

self.ref.queryOrderedByKey().observe(.value, with: {(snapshot) in
                    if snapshot.childrenCount > 0 {
                        for place in snapshot.children.allObjects as! [DataSnapshot] {

当所有地点都在数组中时,我将地点位置与用户位置进行比较,并对数组进行排序以在表格 View 中按距离显示它们。

我尝试了什么: 我也尝试使用 GeoFire,但速度较慢。

数据库的外观(80k 元素):

{
"users": {
    "DFkjdhfgYG": {
         "id":"DFkjdhfgYG"
        ,"key2":"value"
        ,"key3":"value"
        ,"key4":"value"
        ,"key5":"value"
        ,"key6":"value"
        ,"key7":"value"
        ,"key8":"value"
        ,"key9":"value"
        ,"key10":"value"
        ,"key11":"value"
        ,"key12":value
        ,"key13":value
        ,"key14":"value"
        ,"key15":"value"
        ,"key16":"value"
        ,"key17":"value"
        ,"key18":"value"
        ,"key19":"value"
        ,"key20":"value"
        ,"key21":value
        ,"key22":value
        ,"key23":value
        ,"key24":value
        ,"key25":value
        ,"key26":"value"
        ,"key27":value
        ,"key28":value
        ,"key29":"value"
        },
     "BVvfdTRZ": {
         "id":"BVvfdTRZ"
        ,"key2":"value"
        ,"key3":"value"
        ,"key4":"value"
        ,"key5":"value"
        ,"key6":"value"
        ,"key7":"value"
        ,"key8":"value"
        ,"key9":"value"
        ,"key10":"value"
        ,"key11":"value"
        ,"key12":value
        ,"key13":value
        ,"key14":"value"
        ,"key15":"value"
        ,"key16":"value"
        ,"key17":"value"
        ,"key18":"value"
        ,"key19":"value"
        ,"key20":"value"
        ,"key21":value
        ,"key22":value
        ,"key23":value
        ,"key24":value
        ,"key25":value
        ,"key26":"value"
        ,"key27":value
        ,"key28":value
        ,"key29":"value"
        }
  }
}

现在我不知道该怎么做,我绝对需要使用 Firebase。

你能帮我改进我下载 firebase db 元素的方式,或者告诉我另一种方法,让整个过程更快吗?

谢谢!

最佳答案

您在一个函数中使用 for 循环,该函数被调用的次数与您的数据库路径中的子项的调用次数相同,这使得 for 循环完全无用且过度杀伤,这可能会增加整个过程的额外时间。

您可以做的另一件事是在不同的线程上调用它,并使其成为高于其余代码的最高优先级。以下是执行这两项操作的方法:

func handleFirebase() {
    DispatchQueue.global(qos: .userInteractive).async {
        self.ref.queryOrderedByKey().observe(.value, with: { (snapshot) in

            guard let value = snapshot.value as? String else { return }
            let key = snapshot.key

            print("KEY: \(key), VALUE: \(value)")

        }, withCancel: nil)
    }
}

关于ios - Firebase 观察大型数据库缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48460536/

相关文章:

android - 知道应用程序在 Firebase 崩溃后何时首次打开?

javascript - 不同域的 FCM 凭据

swift - Firebase 在 Swift 中返回句柄和引用的正确方法是什么

ios - 根据对象类型更改 iOS 上的注释图像

ios - UITableView 与 UITextView 对齐

swift - 类型 '[SKNode ]' 的值没有成员 'name'

swift - 单击选项卡栏图标时重置 ViewController

ios - 在 segue 期间从 UINavigationController 的导航堆栈中删除 View Controller ?

ios - Swift - prepareforsegue 值未传递到所需的 init

iphone - 使 iOS 应用程序具有启用和禁用声音的选项