【问题标题】:Wait 1-2 sec for fetching data from Firebase before data show up(IOS)在数据显示之前等待 1-2 秒从 Firebase 获取数据(IOS)
【发布时间】:2019-08-15 06:54:48
【问题描述】:

我创建了具有用户信息页面的应用程序,并且我正在使用 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)
        }
    }

【问题讨论】:

  • 如果这是应用用户的信息,你能不能早一点得到这个值(snapshot.value),例如在appDidFinishLaunching中,存储这个值。并使用它在 viewDidLoad 中加载 textFields ?
  • @claude31 你有一些例子我应该把代码的哪一部分放在 appDidFinishLaunching 中,以及如何使用它在 viewDidLoad 中加载 textFields?
  • 你可以创建一个全局变量 var userDic: NSDictionary?然后,在finishLaunching中,调用修改后的getUserDetails func getUserDetails() { ref = Database.database().reference().child("Users/Sellers/(userID)/user_info/") ref.observeSingleEvent(of: .value, with: { (snapshot) in userDic = snapshot.value as?NSDictionary 在 vi​​ewDidLoad 中使用 self.userIDText.text = userDic?["userID"] as?String ?? ""
  • @Thanakorn 为了更清楚,我将在答案部分发布代码,即使我无法测试它
  • 我看不到你的问题;您正在尝试从使用网络的远程源获取一些数据,当然您会等待一段时间,每个应用都会这样做,每个应用只会显示进度视图;可能有一个缓存系统来加速你的加载,但你仍然不能指望所有的远程调用都会立即执行

标签: swift firebase firebase-realtime-database


【解决方案1】:

在类之外创建全局变量。 如下更改 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
    }

【讨论】:

  • 像这样的崩溃和错误 *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“必须先配置默认的 FIRApp 实例,然后才能初始化默认的 FIRAuthinstance。确保这一点的一种方法是在 App Delegate 的 application:didFinishLaunchingWithOptions:(Swift 中为 application(_:didFinishLaunchingWithOptions:))中调用 [FIRApp configure];(Swift 中为 FirebaseApp.configure())。'
  • 我很高兴你能帮助我的 var ref: DatabaseReference!
猜你喜欢
  • 2021-04-26
  • 2021-07-12
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多