【发布时间】:2016-12-11 02:18:55
【问题描述】:
我正在使用 Firebase 构建一个 Swift 应用程序,而且我对这两个应用程序都很陌生,所以请保持温和。目前,当我打开应用程序时,它会再次同步整个数据库并导致用户盯着空的 tableview 时出现 2 或 3 秒的延迟。如何加快速度?
有什么想法吗?
我的代码:
我的 loadContacts 函数
func loadContact(snap : FIRDataSnapshot) -> Contact {
let key = snap.key
let contact = (snap.value) as? NSDictionary
let c1 = Contact(
id: (contact?["id"] as? String)!,
firebasekey: key,
first_name: (contact?["First Name"] as? String)!,
middle_name: (contact?["Middle Name"] as? String)!,
last_name: (contact?["Last Name"] as? String)!,
suffix: (contact?["Suffix"] as? String)!,
company: (contact?["Company"] as? String)!,
phone_labe1: (contact?["Phone Label 1"] as? String)!,
phone1: (contact?["Phone 1"] as? String)!,
phone_label2: (contact?["Phone Label 2"] as? String)!,
phone2: (contact?["Phone 2"] as? String)!,
email_label1: (contact?["Email Label 1"] as? String)!,
email1: (contact?["Email 1"] as? String)!,
email_label2: (contact?["Email Label 2"] as? String)!,
email2: (contact?["Email 2"] as? String)!,
social: (contact?["Social Security Number"] as? String)!,
dob: (contact?["Date of Birth"] as? String)!,
street: (contact?["Street"] as? String)!,
city: (contact?["City"] as? String)!,
zip: (contact?["ZIP and Postal Code"] as? String)!,
state: (contact?["State and Province"] as? String)!,
reg_number: (contact?["Reg Num"] as? String)!,
stable_reg_number: (contact?["Stable Reg Num"] as? String)!,
emergency_contact: (contact?["Emergency Contact"] as? String)!,
emergency_phone: (contact?["Emergency Phone"] as? String)!,
drivers_license: (contact?["Driver's License Num"] as? String)!,
insurance_carrier: (contact?["Insurance Carrier"] as? String)!,
details: (contact?["Details"] as? String)!,
insurance_exp: (contact?["Insurance Expiration Date"] as? String)!,
insurance_group: (contact?["Insurance Group Num"] as? String)!,
insurance_member: (contact?["Insurnace Member Num"] as? String)!, // spelled wrong in database
job_title: (contact?["Job Title"] as? String)!,
date_modified: (contact?["Modified"] as? String)!,
keywords: [],
notes: []
)
return c1;
}
在我的联系人表格视图中
import UIKit
import Firebase
class ContactTableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate {
// MARK: Properties
var contactSearchResults : [Contact] = []
// FIRDatabase.database().persistenceEnabled = true
let contactRef = FIRDatabase.database().reference().child("contacts")
override func viewDidLoad() {
contactRef.queryOrdered(byChild: "Last Name").observe(.childAdded) { (snap: FIRDataSnapshot) in
contacts.append(loadContact(snap: snap))
self.tableView.reloadData()
}
contactRef.queryOrdered(byChild: "Last Name").observe(.childChanged) { (snap: FIRDataSnapshot) in
// this code here is wrong, but it doesn't matter for demonstration purposes
contacts.append(loadContact(snap: snap))
self.tableView.reloadData()
}
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
我的数据库结构类似于
联系人(我的问题区域)中有大约 4000 条记录,每个记录有 33 个单独的子值。
【问题讨论】:
-
Firebase 是一个实时数据库,它应该消除在本地存储数据的需要 - 这将根据您的用例而有所不同。话虽如此,如果您从 Firebase 加载 tableView 有 2-3 秒的延迟,那么您还有其他问题,因为它应该感觉几乎是立即的;在几分之一秒内加载数千名用户。另一个问题是您提到“它再次同步整个数据库”,这有点奇怪,因为它应该只从 Firebase 检索适用于您向用户显示的(例如)tableView 的数据。
-
@Jay 感谢您的回复!我几乎可以立即加载,您对导致延迟的原因有什么建议吗?
-
@NickWinner 我们需要查看更多代码和数据库结构才能回答这个问题。
-
您的延迟可能与硬件/互联网相关,也可能是编码错误。很难说。您可以随时通过speedof.me 测试您的互联网响应。但即使连接速度为 10Mbps,Firebase 服务器也非常快,您应该能够在几分之一秒内加载数千字节的数据。作为一个比较点,通过该测试,我运行 200Mbps 下降和 18Mbps 上升,24ms 延迟。首先检查一下,如果不是,请检查您的代码。
-
@JordiBruin 好的,我已经编辑了我的帖子以包含相关代码(我认为)。我已经尝试过您的建议,但我无法摆脱这种滞后。
标签: ios swift firebase firebase-realtime-database offline