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.