I'm building a Swift app using Firebase, and I'm new to both so be gentle. Currently, when I open the app, it syncs the entire database again and causes a 2 or 3 second lag where the user stares at an empty tableview. How can I speed this up?
Any thoughts?
My code:
My loadContacts function
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;
}
And in my contact table view
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()
}
My database has structured like
Contacts (my problem area) has about 4000 records in it with 33 individual children values each.
See Question&Answers more detail:
os