Firebase观察大型数据库的速度很慢

时间:2018-01-26 11:32:09

标签: ios swift firebase firebase-realtime-database

我正在开发一个基于用户位置显示地点(从firebase下载)的应用程序。

我目前有5k条目,它们会在大约10秒内显示出来。 我打算有80k条目,我不希望用户等那么久。

我做了什么: 我创建了一个Place类,我在firebase ref上'观察'(。value),并且在每个子元素上我将每个元素放在Place类的属性中。 然后将地点:Place = Place(attributes)id添加到数组中:放置直到所有地点都已下载。

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

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

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

db的外观(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数据库元素的方式,或者告诉我另一种方法,让整个过程更快吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

你在一个被调用的函数中使用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)
    }
}