Saya memiliki serangkaian kunci yang mengarah ke objek posting untuk jejaring sosial saya seperti so / posts / id / (post info)
Ketika saya memuat posting saya memuat / posts / 0 dan kemudian / posts / 1 dll menggunakan observeSingleEventOfType(.Value)
metode.
Saya menggunakan lazyTableView
untuk memuat 30 sekaligus dan itu cukup lambat. Apakah ada cara saya dapat menggunakan salah satu metode kueri atau cara lain untuk membuatnya lebih cepat bahkan jika saya harus merestrukturisasi data di pohon JSON saya.
Saya berasal dari Parse yang menerapkan ulang aplikasi saya dan sejauh ini pengalamannya cukup bagus. Hanya satu hal ini saya agak terjebak. Terima kasih sebelumnya atas bantuannya!
EDIT:
func loadNext(i: Int) {
// check if exhists
let ideaPostsRef = Firebase(url: "https://APPURL")
ideaPostsRef.childByAppendingPath(i.description).observeSingleEventOfType(.Value, withBlock: {
(snapshot) in
if i % 29 == 0 && i != 0 && !self.hitNull { return }
// false if nil
// true if not nil
if !(snapshot.value is NSNull) {
let postJSON = snapshot.value as! [String: AnyObject]
print("GOT VALID \(postJSON)")
let post = IdeaPost(message: postJSON["message"] as! String, byUser: postJSON["user"] as! String, withId: i.description)
post.upvotes = postJSON["upvotes"] as! Int
self.ideaPostDataSource.append(post)
self.loadNext(i + 1)
} else {
// doesn't exhist
print("GOT NULL RETURNING AT \(i)")
self.doneLoading = true
self.hitNull = true
return
}
}
}
Fungsi rekursif ini pada dasarnya berjalan mendapatkan nilai untuk kunci nomor i dari firebase. Jika NSNULL ia tahu itu adalah posting terakhir yang mungkin dimuat dan tidak pernah melakukannya lagi. Jika NSNULL tidak terkena tetapi i % 29 == 0
kemudian kembali sebagai kasus dasar sehingga hanya 30 posting yang dimuat pada satu waktu (0 diindeks). Saat saya menyetel doneLoading
ke true
, tableView.reloadData()
dipanggil menggunakan pengamat properti.
Berikut adalah contoh dari array yang saya ambil
"ideaPosts" : [ {
"id" : 0,
"message" : "Test",
"upvotes" : 1,
"user" : "Anonymous"
}, {
"id" : 1,
"message" : "Test2",
"upvotes" : 1,
"user" : "Anonymous"
} ]
Jawaban:
Pembaruan: kami sekarang juga membahas pertanyaan ini dalam episode AskFirebase .
Memuat banyak item dari Firebase tidak harus lambat, karena Anda dapat menyalurkan permintaan. Tetapi kode Anda membuat ini tidak mungkin, yang memang akan menyebabkan kinerja yang kurang optimal.
Dalam kode Anda, Anda meminta item dari server, tunggu item itu kembali dan kemudian muat yang berikutnya. Dalam diagram urutan yang disederhanakan yang terlihat seperti:
Dalam skenario ini Anda menunggu 30 kali waktu perjalanan pulang pergi + 30 kali waktu yang dibutuhkan untuk memuat data dari disk. Jika (demi kesederhanaan) kami mengatakan bahwa perjalanan bolak-balik membutuhkan waktu 1 detik dan memuat item dari disk juga membutuhkan satu detik yang paling sedikit hingga 30 * (1 + 1) = 60 detik.
Dalam aplikasi Firebase, Anda akan mendapatkan kinerja yang jauh lebih baik jika mengirim semua permintaan (atau setidaknya dalam jumlah yang wajar) sekaligus:
Jika kami mengasumsikan lagi perjalanan pulang pergi 1 detik dan pemuatan 1 detik, Anda menunggu selama 30 * 1 + 1 = 31 detik.
Jadi: semua permintaan melalui koneksi yang sama. Mengingat bahwa, satu-satunya perbedaan antara
get(1)
,get(2)
,get(3)
dangetAll([1,2,3])
beberapa overhead untuk frame.Saya menyiapkan jsbin untuk mendemonstrasikan perilakunya . Model datanya sangat sederhana, tetapi menunjukkan perbedaannya.
Sebagai perbandingan: memuat 64 item secara berurutan membutuhkan waktu 3,8 detik di sistem saya, sementara memuatnya melalui pipeline (seperti yang dilakukan klien Firebase secara asli) dibutuhkan 600ms. Jumlah pastinya akan bergantung pada koneksi Anda (latensi dan bandwidth), tetapi versi pipeline harus selalu lebih cepat secara signifikan.
sumber