我正在开发一个基于用户位置显示地点(从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数据库元素的方式,或者告诉我另一种方法,让整个过程更快吗?
谢谢!
答案 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)
}
}