【问题标题】:Firebase ios sdk async and threadsFirebase ios sdk 异步和线程
【发布时间】:2015-11-18 18:29:36
【问题描述】:

有谁知道使用 Firebase iOS SDK 远程调用 Firebase 是使用主线程还是后台线程?

我在文档中找不到任何内容。

【问题讨论】:

  • 您能详细说明为什么要问这个问题吗?即可能有其他解决方案。
  • 因为我想了解我是否需要使用后台线程来使用 Firebase SDK 进行异步调用,或者我需要切换到 Firebase 回调函数中的主线程才能使用 UI
  • Firebase 为您处理。所有 Firebase 调用都可以异步完成,无需担心线程。您可能有一个特殊情况,但如果您使用 Firebase 来处理您的数据,那么就让它来完成繁重的工作。如果您还没有这样做,请按照入门指南编写一个小应用程序来感受一下。 Getting Started

标签: ios firebase


【解决方案1】:

Firebase 并没有完全消除对线程的担忧。因为 Firebase 回调总是在主线程上返回,所以从后台线程调用 Firebase 观察/观察者单事件时需要特别小心。

考虑用例:

DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {[weak weakSelf = self] in
 // Do something computationally intensive

 ref.child(somePath).observeSingleEvent(of: .value, with: { (snapshot) in
  DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {[weak weakSelf = self] in {
   // Do some computationally intensive non-critical activity based on data retrieved from Firebase
  }
 }
}

【讨论】:

  • 您能否详细说明您详细介绍的用例有什么问题?
  • 没错,截至 2019 年 12 月,Firebase 的“observeSingleEvent”回调仍会在主线程上返回,这种行为确实很危险。例如,我遇到了由 Firebase 回调使用 T1 访问一个变量引起的竞争条件,该变量也由产生 Firebase 调用的同一线程 T20 访问,稍后几条指令。
  • @martin 你是怎么解决这个问题的?
  • @TomGatward 我将在回调中运行的代码包装到一个特定的 DispatchQueue 中,即 DispatchQueue.global(qos: .utility).async { ... },它与跨越的队列相同首先是 Firebase 调用。这样,我可以确定回调里面处理代码的队列和调用它的队列是一样的,并且代码不会在主线程上运行。
【解决方案2】:

Firebase 使用它自己的后台线程。但正如 Jay 在 cmets 中提到的,Firebase 消除了对线程的担忧。

所以基本上没有必要在您自己的后台线程中运行 Firebase。

【讨论】:

  • 您不必担心线程——除非您希望完成块在 UI 线程上执行某些操作!
  • @David East,你对this问题怎么看?
  • @Cesar 实际上,完成块在主(UI)线程上运行
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2011-07-03
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多