Filter Firebase Data SwiftUI



此代码将所有数据添加到单个数组中。在HomeViev中,我使用Foreach,并将数据添加到列表中。但我必须把数据一分为二。状态集合有两种类型"活动"one_answers"关闭",但我不知道如何过滤

import SwiftUI
import Combine
import Firebase
let dbCollection = Firestore.firestore().collection("Signals")
class FirebaseSession : ObservableObject {
@Published var session: User? { didSet { self.didChange.send(self) }}
@Published var data = [Signal]()
var didChange = PassthroughSubject<FirebaseSession, Never>()
var handle: AuthStateDidChangeListenerHandle?

func listen () {
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
print("Got user: (user)")
self.session = User(uid: user.uid, email: user.email)
self.readData()
} else {
self.session = nil
}
}
}
func readData() {
dbCollection.addSnapshotListener { (documentSnapshot, err) in
if err != nil {
print((err?.localizedDescription)!)
return
}else {
print("read data success")
}
documentSnapshot!.documentChanges.forEach { i in

//从服务器读取实时创建的数据

if i.type == .added {
let id = i.document.documentID
let symbol = i.document.get("symbol") as? String ?? ""
let status = i.document.get("status") as? String ?? ""
self.data.append(Signal(id: id, symbol: symbol, status: status))
}

//从服务器读取实时修改数据

if i.type == .modified {
self.data = self.data.map { (eachData) -> Signal in
var data = eachData
if data.id == i.document.documentID {
data.symbol = i.document.get("symbol") as! String
data.status = i.document.get("status") as? String ?? ""
return data
}else {
return eachData
}
}
}

//删除数据时。。。

if i.type == .removed {
let id = i.document.documentID
for i in 0..<self.data.count{
if self.data[i].id == id{
self.data.remove(at: i)
return
}
}
}
}
}
}

}

问题陈述

但我必须将数据拆分为两个

我假设这意味着两个数组;一个用于活动,一个用于关闭。

var activeData = [...
var closedData = [...

有几种方法可以实现

1(查询Firestore中所有等于活动的状态字段并将这些文档加载到活动数组中,然后另一个查询等于关闭的状态字段,并将其加载到关闭数组中

2(我建议采用一种更简单的方法

if i.type == .added {
let id = i.document.documentID
let symbol = i.document.get("symbol") as? String ?? ""
let status = i.document.get("status") as? String ?? ""
if status == "active" {
self.activeData.append(Signal(id: id, symbol: symbol, status: status))
} else {
self.closedData.append(Signal(id: id, symbol: symbol, status: status))
}
}

并在.修改和.删除中做同样的事情;识别状态,以便代码知道要从哪个数组中删除它。

编辑:

基于评论

我不知道如何查询这些代码。

我提供的代码用于查询活动的信号。此代码将只返回活动信号,当信号变为活动、非活动等时,这将修改信号阵列以与数据保持同步。

let dbCollection = Firestore.firestore().collection("Signals")
let query = dbCollection.whereField("status", isEqualTo: "active").addSnapshotListener( { querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error fetching snapshots: (error!)")
return
}
snapshot.documentChanges.forEach { diff in
if (diff.type == .added) {
let signalToAdd = Signal(withDoc: diff.document)
self.signalArray.append(signalToAdd)
}
if (diff.type == .modified) {
let docId = diff.document.documentID
if let indexOfSignalToModify = self.signalArray.firstIndex(where: { $0.signal_id == docId} ) {
let signalToModify = self.signalArray[indexOfSignalToModify]
signalToModify.updateProperties(withDoc: diff.document)
}
}
if (diff.type == .removed) {
let docId = diff.document.documentID
if let indexOfSignalToRemove = self.signalArray.firstIndex(where: { $0.signal_id == docId} ) {
self.signalArray.remove(at: indexOfSignalToRemove)
}
}
}
})

请注意,我的Signal类有一个初始化器,它接受QueryDocumentSnapshot来初始化它,还有一个.updateProperties函数来更新它的内部属性。

最新更新