【问题标题】:Using semaphore for sync firebase query in Swift 4在 Swift 4 中使用信号量进行同步 firebase 查询
【发布时间】:2026-01-20 19:50:01
【问题描述】:

我正在尝试使用信号量让代码等待 firebase 查询结果。

代码如下:

var valor: Decimal = 0
let dateFormatter = DateFormatter()
let semaphore = DispatchSemaphore(value: 0)
dateFormatter.dateFormat = "mm/dd/yyyy"
//procedimenton para leitura dos dados no Firebase e jogar no array
Constants.refs.databaseRoot.child("Lancamentos").queryOrdered(byChild: "ContaDebito").queryEqual(toValue: "1.1.6").observe(.value, with: { snapshot in
    if let snapshots = snapshot.children.allObjects as? [DataSnapshot] {
        for snap in snapshots {
            if let postDict = snap.value as? Dictionary<String, AnyObject> {
                let post = FIRLancamento()
                post.setValuesForKeys(postDict)
                    let credito = post.Valor
                    valor += Decimal(string: credito)!
                print (credito + " " + String(describing: valor))

            }
        }
        semaphore.signal()
    }

})
semaphore.wait()
print(valor)

当我运行此代码时,信号量信号永远不会被触发并且程序保持冻结状态,并且我在控制台中看到以下错误:

2017-10-26 16:55:23.830048-0400 BVI_Swift[10830:1929792] TI​​C TCP 连接失败 [1:0x604000169a80]: 3:-9802 Err(-9802) 2017-10-26 16:55:23.831266-0400 BVI_Swift[10830:1929792] NSURLSession/NSURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9802) 2017-10-26 16:55:23.831597-0400 BVI_Swift[10830:1929792] 任务。 HTTP 加载失败(错误代码:-1200 [3:-9802]) 2017-10-26 16:55:23.832476-0400 BVI_Swift[10830:1929780] 任务。完成错误 - 代码:-1200

如果我注释 semaphore.wait() 行,查询将完美运行,但 print(valor) 行在它有任何值之前被执行。

【问题讨论】:

  • 你找到解决方案了吗??

标签: swift firebase-realtime-database semaphore


【解决方案1】:

当你这样做时你会阻塞主线程吗? 举个例子;如果在按钮选择器函数中运行此块并且不返回;所有应用程序都将冻结,因此semaphore.signal() 将永远不会执行。

尝试像这样运行该块:

func buttonClick() {
   DispatchQueue.global(qos: .background).async {
      // your sync firebase operation
      // ...
   }
}

【讨论】: