Firebase ios sdk 异步和线程

Posted

技术标签:

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

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

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

【问题讨论】:

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

以上是关于Firebase ios sdk 异步和线程的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Firebase 控制台在 SDK 已与我的 Android 和 iOS 应用程序集成时要求我实施 SDK?

iOS - pod 'Google-Mobile-Ads-SDK' 和 pod 'Firebase/AdMob' 有啥区别

Firebase - iOS SDK - 按子值过滤

在 iOS 上使用 Firebase SDK 作为全新设备开始

Firebase iOS 6.30.0 SDK 崩溃 - GPBCreateMessageWithAutocreator

Swift 2.3 pod 更新后使用未解析的标识符 Firebase 'FIR'