0
두 개의 참조 (동일한 경로에 대한 참조)가 있습니다. 하나는 보류중인 주문을 수신하고 다른 하나는 완료된 주문을 수신합니다. 사용자가 변경할 수있는 특정 위치의 모든 것.Firebase + Swift : removeAllObservers가 작동하지 않습니까?
내가 지금 사용하고 메커니즘은 이것이다 :
- 내 배열에 내가 주문을 보류중인 이벤트를
observe
전에 중포 기지는 - 를 참조 저장할 배열, 푸시 중포 기지의 참조를 만듭니다
- 완료된 주문에 대한
observe
이벤트가 있기 전에 해당 Firebase 참조를 내 배열로 밀어 넣으십시오. - 사용자가 위치를 전환하면 내 배열의 모든 참조에 대한 모든 옵저버를 제거하십시오. 배열을 비우고 새 위치/완료된 주문을 보류중인 듣기 시작 (2 단계, 3) 는
내 코드는 다음과 같습니다
struct Firebase {
private let ORDERS_PATH = "locations-orders"
private static var references = [FIRDatabaseReference]()
static func observePendingOrders(lId: String, f: @escaping (AppState.Order) ->()) {
print("observing orders for \(ORDERS_PATH)/\(lId)")
let pendingOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)")
self.references.append(pendingOrdersReference)
pendingOrdersReference
.child(dateKeyToday())
.queryOrdered(byChild: "created_at")
.observe(.childAdded, with: { firebaseSnapshot in
...
print("order received for \(ORDERS_PATH)/\(lId)")
}
)
}
static func fetchCompletedOrders(lId: String, f: @escaping ([AppState.Order]) ->()) {
print("observing completed orders for \(lId)")
let completedOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)")
self.references.append(completedOrdersReference)
completedOrdersReference
.child(dateKeyToday())
.queryOrdered(byChild: "status_updated_at")
.observe(.value, with: { firebaseSnapshot in
...
}
)
}
static func removeAllOrderObservers() {
for reference in references {
print("removing reference \(reference)")
reference.removeAllObservers()
}
self.references = []
}
}
그러나, 나는이 주문의 위치를 로그인 할 때 내가 지켜보고있는 것처럼, 이전 관측통이 여전히 주문을 듣고있는 위치를 전환 한 후에도 마찬가지입니다.
observing orders for locations-orders/9RC4H9ZAE457E // first location
observing completed orders for 9RC4H9ZAE457E
removing reference https://mydb-123.firebaseio.com/locations-orders/9RC4H9ZAE457E // switch locations, remove all existing observers for location 9RC4H9ZAE457E
removing reference https://mydb-123.firebaseio.com/locations-orders/9RC4H9ZAE457E
observing orders for locations-orders/1JS53G0TT5ZQD // start listening for orders in new location. notice the new id: 1JS53G0TT5ZQD
observing completed orders for 1JS53G0TT5ZQD
order received for locations-orders/9RC4H9ZAE457E // <-- why is this still showing up?
order received for locations-orders/1JS53G0TT5ZQD
order received for locations-orders/1JS53G0TT5ZQD
order received for locations-orders/9RC4H9ZAE457E // <-- and this one too??
order received for locations-orders/1JS53G0TT5ZQD
order received for locations-orders/1JS53G0TT5ZQD
=== 업데이트 === 심지어 핸들을 시도하고 작동하지 않았다 : 여기 내 로그입니다
struct Firebase {
private static var handles = [UInt]()
private static var references = [FIRDatabaseReference]()
static func observePendingOrders(lId: String, f: @escaping (AppState.Order) ->()) {
print("observing orders for \(ORDERS_PATH)/\(lId)")
let pendingOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)")
self.references.append(pendingOrdersReference)
let handle = pendingOrdersReference
.child(dateKeyToday())
.queryOrdered(byChild: "created_at")
.observe(.childAdded, with: { firebaseSnapshot in
...
}
)
handles.append(handle)
}
static func fetchCompletedOrders(lId: String, f: @escaping ([AppState.Order]) ->()) {
print("observing completed orders for \(ORDERS_PATH)/\(lId)")
let completedOrdersReference = FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)")
self.references.append(completedOrdersReference)
let handle = completedOrdersReference
.child(dateKeyToday())
.queryOrdered(byChild: "status_updated_at")
.observe(.value, with: { firebaseSnapshot in
...
}
)
handles.append(handle)
}
static func removeAllOrderObservers() {
// for reference in references {
// print("removing reference \(reference)")
// reference.removeAllObservers()
// }
//
if !references.isEmpty {
let ref = references[0]
for handle in handles {
print("removing handle \(handle)")
ref.removeObserver(withHandle: handle)
}
self.references = []
}
}
}
내 첫 번째 질문입니다; 왜 이런 짓을하는? 일단 관찰자를 추가하면 관측을 계속하고 관련 이벤트에 따라 폐쇄를 호출합니다. 배열에 대한 참조를 유지할 필요가 없습니다. 이 경우 Orders 노드에서 발생하는 모든 이벤트가 앱에 알립니다. – Jay
안녕하세요. Jay. 앱은 다음과 같이 사용됩니다. 사용자가 위치를 선택하고 해당 위치의 모든 주문을 봅니다. 주문이 위치를 전환하면 이전 위치가 아닌 새로운 위치의 주문 만 표시됩니다. – Edmund
동일한 위치에서 .childAdded 및 .value를 관찰하는 것처럼 보입니다. – Jay