首页 > 解决方案 > 在数据显示之前等待 1-2 秒从 Firebase 获取数据(IOS)

问题描述

我创建了具有用户信息页面的应用程序,并且我正在使用 Firebase 实时数据库来检索数据。我检索了所有数据,但我必须等待 1 - 2 秒才能显示信息。

我应该怎么做才能解决这个问题?

这就是我从firebase读取数据的方式

var ref: DatabaseReference!

override func viewDidLoad() {
        super.viewDidLoad()

        getUserDetails()
}

func getUserDetails () {
        ref = Database.database().reference().child("Users/Sellers/\(userID)/user_info/")
        ref.observeSingleEvent(of: .value, with: { (snapshot) in

            let value = snapshot.value as? NSDictionary

            self.userIDText.text = value?["userID"] as? String ?? ""
            self.userIDText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

            self.changeNameText.text = value?["name"] as? String ?? ""
            self.changeNameText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

            self.addressText.text = value?["address"] as? String ?? ""
            self.addressText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

            self.emailText.text = value?["email"] as? String ?? ""
            self.emailText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

            self.phoneNumberText.text = value?["phone_number"] as? String ?? ""
            self.phoneNumberText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

        }) { (error) in
            print(error.localizedDescription)
        }
    }

标签: swiftfirebasefirebase-realtime-database

解决方案


在类之外创建全局变量。如下更改 ViewController。注意:我看不到您在哪里定义 ref。

var userDic: NSDictionary?

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        self.userIDText.text = userDic?["userID"] as? String ?? ""
        self.userIDText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

        self.changeNameText.text = userDic?["name"] as? String ?? ""
        self.changeNameText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

        self.addressText.text = userDic?["address"] as? String ?? ""
        self.addressText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

        self.emailText.text = userDic?["email"] as? String ?? ""
        self.emailText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)

        self.phoneNumberText.text = userDic?["phone_number"] as? String ?? ""
        self.phoneNumberText.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
    }

}

在 AppDelegate 中:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func getUserDetails () {
        ref = Database.database().reference().child("Users/Sellers/\(userID)/user_info/")
        ref.observeSingleEvent(of: .value, with: { (snapshot) in
            userDic = snapshot.value as? NSDictionary
        }) { (error) in
            print(error.localizedDescription)
        }
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        getUserDetails()
        return true // Could test if userDic != nil
    }

推荐阅读